Rechtecksdrehung im Koordinatensystem

  • Ich arbeite an einem bauphysikalischen Programm zur Berechnung des Heizwärmebedarfs von Gebäuden. Das Hauptproblem liegt bei mir darin, dass in einer kleinen Vorschauskizze die rechteckige Grundfläche eines Hauses (a, b) im richtigen Verhältnis gezeichnet werden soll. Dadurch, dass ein Computerbildschirm in einzelne Bildpunkte geteilt ist, kann man sich das ganze als Kartesisches Koordinatensystem vorstellen. Die Vorschau mit einem normalen Rechteck funktioniert bereits jedoch habe ich ein Problem damit, dass man auch einen Winkel alpha festlegen kann, der die Abweichung des Grundstückes von Norden angibt, sprich das Rechteck soll im Koordinatensystem entsprechend dem Winkel alpha gedreht werden. Das Problem, dass ich jetzt habe, ist, dass ich nicht genau weiß wie ich die Koordinaten der Punkte (A, B, C, D) des gedrehten Rechteckes ermitteln kann. Ich habe zwar schon probiert, das Problem mit Vektoren bzw. Matrizen zu lösen, bis jetzt aber ohne Erfolg.

    informatik-forum.net/attachment/12322/

    informatik-forum.net/attachment/12323/

    Mit freundlichen Grüßen

  • Das geht ganz leicht - du schreibst eine 2x2 Transformationsmatrix A, und in deren 1. Spalte schreibst du den Vektor, zu dem der gedrehte x-Einheitsvektor werden soll. In die zweite Spalte den gedrehten y-Einheitsvektor. Dann rechnest du A*p für jeden Punkt p aus - fertig.

    Der gedrehte x-Einheitsvektor wäre z.B. (für eine Drehung um α nach links, um den Ursprung):

    (cos α, sin α) - das musst du aber in Spaltenforum hinschreiben

    Und der gedrehte y-Einheitsvektor ist dann wohl:

    (-sin α, cos α)

    Alles aus den Fingern gesogen, keine Garantie für Korrektheit ;)

  • Hallo!

    Ja so in der Richtungen, hatte ich es ja auch nur dann sieht die Darstellung im Programm wie folgt aus und nicht wie sie tatsächlich sein soll.

  • Ich weiß nicht, haber aber alles genau kontrolliert, doch es wird immer verzerrt dargestellt, habe mir eh schon viele Anleitungen über Matrizen und so durchgelesen, doch ich habe es bis jetzt noch nicht so hinbekommen.

    Danke, für deine bisherigen Antworten.

  • sin und cos nehmen ihre Argumente üblicherweise in Radianten, nicht in Grad. Vielleicht ist das ein Problem? (Ich glaub eigentlich fast nicht, weil ich mir so auf die Schnelle keine Verzerrung dadurch erklären kann.)

    *plantsch*

  • Also das ist der Code, der die ursprünglichen Koordinaten in die neuen Koordinaten umwandelt.

    `$1...x1
    `$2...y1
    `$3...x2
    `$4...y2
    `$5...x3
    `$6...y3
    `$7...x4
    `$8...y4
    `$9...Winkelverschiebung um alpha(-180°-180°)

    C_INTEGER($1;$2;$3;$4;$5;$6;$7;$8;$9)
    C_INTEGER($x_1;$x_2;$x_3;$x_4;$y_1;$y_2;$y_3;$y_4)
    C_INTEGER($M_x;$M_y)
    C_INTEGER($x1;$x2;$x3;$x4;$y1;$y2;$y3;$y4)
    C_REAL($alpha)

    $alpha:=$9*Degree

    If (($alpha=0) | ($9=180) | ($9=(-180)))
    $x_1:=$1
    $y_1:=$2
    $x_2:=$3
    $y_2:=$4
    $x_3:=$5
    $y_3:=$6
    $x_4:=$7
    $y_4:=$8
    Else
    If ($9<0)

    $x_1:=$1*Cos($alpha)-$2*Sin($alpha)
    $x_2:=$3*Cos($alpha)-$4*Sin($alpha)
    $x_3:=$5*Cos($alpha)-$6*Sin($alpha)
    $x_4:=$7*Cos($alpha)-$8*Sin($alpha)

    $y_1:=$1*Sin($alpha)+$2*Cos($alpha)
    $y_2:=$3*Sin($alpha)+$4*Cos($alpha)
    $y_3:=$5*Sin($alpha)+$6*Cos($alpha)
    $y_4:=$7*Sin($alpha)+$8*Cos($alpha)
    Else
    $alpha:=$alpha*(-1)

    $x_1:=$1*Cos($alpha)-$2*Sin($alpha)
    $x_2:=$3*Cos($alpha)-$4*Sin($alpha)
    $x_3:=$5*Cos($alpha)-$6*Sin($alpha)
    $x_4:=$7*Cos($alpha)-$8*Sin($alpha)

    $y_1:=$1*Sin($alpha)+$2*Cos($alpha)
    $y_2:=$3*Sin($alpha)+$4*Cos($alpha)
    $y_3:=$5*Sin($alpha)+$6*Cos($alpha)
    $y_4:=$7*Sin($alpha)+$8*Cos($alpha)
    End if
    End if

    ARRAY INTEGER(koord;8)

    koord{1}:=$x_1
    koord{2}:=$y_1
    koord{3}:=$x_2
    koord{4}:=$y_2
    koord{5}:=$x_3
    koord{6}:=$y_3
    koord{7}:=$x_4
    koord{8}:=$y_4

    $0:=koord

  • Schaut jetzt auf den ersten Blick nicht so falsch aus, auch wenn diese ganzen Fallunterscheidungen in Abhängigkeit vom Winkel völlig umsonst sind.

    Wie wird denn das dargestellt? Vielleicht sind einfach die Achsen unterschiedlich skaliert.

  • C_REAL($1;$2)
    C_REAL($ges)
    C_INTEGER($laenge;$breite;$links;$oben;$3)

    $CTOffscr:=CT New offscreen area
    CT SET DOCUMENT SIZE ($CTOffscr;300;350)

    $ges:=$1+$2
    $laenge:=(150/$ges)*$1
    $breite:=(150/$ges)*$2

    $links:=(150-$laenge)/2
    $oben:=(150-$breite)/2


    ARRAY INTEGER(koord;8)
    koord:=PROJ_AssistentWinkelVersch ($links;$oben;$links+$laenge;$oben;$links+$laenge;$oben+$breite;$links;$oben+$breite;$3)

    ARRAY INTEGER(koordX;5)
    ARRAY INTEGER(koordY;5)

    For ($i;1;8)
    koord{$i}:=koord{$i}+150
    End for

    koordX{1}:=koord{1}

    koordX{2}:=koord{3}
    koordX{3}:=koord{5}
    koordX{4}:=koord{7}

    koordY{1}:=koord{2}
    koordY{2}:=koord{4}
    koordY{3}:=koord{6}

    koordY{4}:=koord{8}

    koordX{5}:=koordX{1}
    koordY{5}:=koordY{1}

    $0:=CT Array to polygon ($CTOffscr;koordX;koordY)

    $pict:=CT Area to picture ($CTOffscr;-2)
    [Projekt];"ProjektAssistent"PictFormLage:=$pict
    CT DELETE OFFSCREEN AREA ($CTOffscr)

  • Weiß jetzt nicht genau, wie sich das äußert, aber ich würd an deiner Stelle keine Integers für die Koordinaten verwenden, auch wenns am Bildschirm dann wieder ints sind. Rechne intern besser mit Gleitkommazahlen.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!