Frage von Florian366, 59

Ich will ein Rechteck rotieren von dem Mittelpunkt aus?

Hallo!

Ich braucht die neuen Koordinaten wenn ich ein Rechteck zB um 30 Grad drehe. Hier ein Beispiel: A: 3, 5 B = 5, 5 C = 5, 2 D = 3, 2

wie bekomm ich die neuen Koordinaten wenn ich das Rechteck um 30 Grad um den Mittelpunkt drehe.

Mfg

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Schachpapa, 17

Am elegantesten mit Vektorrechnung und Drehmatrix:

     ( cos a  -sin a )   ( 3 )   ( 3 cos a - 5 sin a )
A' = ( sin a cos a ) * ( 5 ) = ( 3 sin a + 5 cos a )

Das ist die Drehung um den Ursprung, d.h Mittelpunkt des Koordinatensystems. Wenn du um einen anderen Punkt drehen willst, verschiebst du diesen erst zum Mittelpunkt, drehst mit obiger Matrix und schiebst dann zurück.

Kommentar von Schachpapa ,

Drehung um einen beliebigen Punkt (x1,y1):

x' = x1 + cos a * (x - x1) - sin a * (y - y1)
y' = y1 + sin a * (x - x1) + cos a * (y - y1)

In deinem Fall ist (x1|y1) = (4|3,5)

macht für Punkt A(3|5)

x' = 4 + 0,866 * (-1) - 0.5 * 1,5 = 3,88
y' = 3,5 + 0.5 * (-1) + 0,866 * 1,5 = 4,299

Kommentar von Florian366 ,

Hey, danke ich habe es ausprobiert aber es funktioniert nicht perfekt: hier ein Bild: 

http://imgur.com/a/MIyD9

Der rotumkreiste Punkt ist der Punkt der um den roten Mittelpunkt dreht. 

Am rechten oberen Punkt und am linken unteren Punkt ist er aber zu hoch und zu weit rechts.

Am unteren rechten Punkt ist es perfekt.

Die Koordinaten berechne ich so:

double x = (M.getX() + Math.cos(a) * (R.getX() - M.getX()) - Math.sin(a) * (R.getY() - M.getY()));
double y = (M.getY() + Math.sin(a) * (R.getX() - M.getX()) + Math.cos(a) * (R.getY() - M.getY()));

"M" ist der Mittelpunkt und "R" ist der Punkt der sich bewegen soll (ist Java) 

Waran liegt dass?

Kommentar von Schachpapa ,

Hast du berücksichtigt, dass die trigonometrischen Funktionen im Bogenmaß rad und nicht mit Grad rechnen? D.h wenn a 30° entsprechen soll, musst du umrechnen a_rad = a_deg * Math.PI/180

Kommentar von Florian366 ,

Ja wären es deg wären die Werte komplett falsch!

Hier nochmal alle meine Werte: 

A: 200, 300; B: 800, 300; C: 800, 600; D: 200, 600

M: 500, 450;

Sind diese vielleicht nicht Korrect? 

Kommentar von Florian366 ,

sind rad hab ich vergessen!

Kommentar von Schachpapa ,
Ich habe deinen Code (fett) ausprobiert:

Point M = new Point(500,450);
Point R = new Point(200,300);
double a = 30 * Math.PI/180;
double x = (M.getX() + Math.cos(a) * (R.getX() - M.getX()) - Math.sin(a) * (R.getY() - M.getY()));
double y = (M.getY() + Math.sin(a) * (R.getX() - M.getX()) + Math.cos(a) * (R.getY() - M.getY()));
System.out.println("X " + x);
System.out.println("Y " + y);

Ergebnis passt:
X 315.1923788646684
Y 170.0961894323342

Sollte eigentlich auch für die anderen Punkte passen.
Kommentar von Florian366 ,

Danke ich probiere gleich aus. 

Übringens. Die Java Math Klasse hat auch eine toRadians methode, muss man nich selber rechnen.

Kommentar von Florian366 ,

ist immer noch nicht perfekt: 

hier der Kompletter Sourcecode:

http://pastebin.com/47MS1iDM

hier das Programm: 

kannst du dir ansehen: 

http://www.mediafire.com/download/mc20woc5sx0ai5w/Rotation.jar

Kommentar von Florian366 ,

Das Ergebniss passt schon, ist aber nicht perfekt, es müsste bei 90 grad doch genau die selben Koordinaten wie der B punkt haben?

Kommentar von Schachpapa ,

Warum?

A(200,300)  A'(315.2 , 170.1)
B(800,300) B'(834.8 , 470.1)
C(800,600) C'(684.8 , 729.9)
D(200,600) D'(165.2 , 429.9)

Ach ich sehe gerade, du willst 90° drehen nicht 30°. Mist.
Bin jetzt mind. 5 Std. offline ...

Kommentar von Schachpapa ,

Kann es sein, dass du nicht um M sondern um die obere rechte Ecke der 10x10 Darstellung von M drehst?

Kommentar von Florian366 ,

ich drehe um die obere linke Ecke aber, aber die Rechtecke haben nur eine Größe von 10x10 weil man sie sonst nicht sieht

Kommentar von Florian366 ,

Ähm sorry hab gerade bemerkt dass ich dumm war, bei genau 127 grad ist A Punkt genau an dem B Punkt und ich dachte A würde nicht genau über B bewegen weil ich in 3er Schritten rotiert habe und so war A entweder über B oder daneben.

Jetzt habe ich es, danke für deine Hilfe :D

Mfg

Expertenantwort
von Willy1729, Community-Experte für Mathematik, 14

Hallo,

kann sein, daß die Methode, die ich hier aufschreibe, nicht der Standard ist; aber es funktioniert.

Zunächst stellst Du einmal fest, welche Koordinaten der Mittelpunkt hat.

Dazu addierst Du die Ortsvektoren von A und C, weil sie eine der Diagonalen bilden und teilst die Summe durch 2. Du kannst auch die Koordinaten von B und D verwenden - ist wurscht.

Also A+C=(3/5)+(5/2)=(8/7)

(8/7):2=(4/3,5)=M

Nun nehmen wir uns beispielsweise Punkt A vor. Die Aufgabe ist, den Vektor von M nach a um 30° gegen den Uhrzeigersinn zu drehen und die Koordinate von A' zu bestimmen.

Der Vektor von M nach A ist zu bestimmen durch A-M,
also (3/5)-(4/3,5)=(-1/1,5). Das ist nicht die direkte Verbindung von M nach A, sondern eine Parallele, die im Ursprung des Koordinatensystems beginnt, aber die gleiche Länge und den gleichen Winkel zur x-Achse hat wie MA.

Die Länge bestimmst Du über den Betrag, also √((-1)²+1,5²)=√3,25

Der Winkel ist der arctan von (1,5/-1)=-56,31°. Der Vektor steigt also nach links oben an. Das Minus vor der Gradzahl bedeutet, daß der Winkel an der y-Achse gespiegelt ist. In positiven Zahlen entspricht er
180-56,31=123,69°

Addierst Du 30° dazu,kommst Du auf 153,69°.

Der Vektor, der von M zu A' führt, hat also eine Länge von √3,25 und bildet mit der x-Achse einen Winkel von 153,69°

Nun stell Dir vor, M liegt im Koordinatenursprung und Du trägst den Vektor von dort ab: Winkel: 153,69°, Länge √3,25

Vom Ende dieses Vektors kannst Du Senkrechten auf die x- und auf die y-Achse ziehen, so daß rechtwinklige Dreiecke entstehen, deren gemeinsame Hypotenuse dieser Vektor ist und die besagte Länge hat.

Der x-Wert des Endpunktes dieses Vektors ist dann √3,25*cos (153,69°),

der y-Wert ist √3,25*sin (153,69°)

So kommst Du auf die Koordinaten des Vektors, der vom Ursprung ausgeht und der dem Vektor entspricht, der von M zu A' führt:

(-1,616|0,799) Wenn Du diese Koordinaten zu denen von M addierst, kommst Du auf die Koordinaten von A':(2,384|4,299)

Für die anderen drei Punkte brauchst Du dieses Spiel nicht zu wiederholen, weil Du jetzt mit A' einen Anker hast.

Es genügt, um etwa B' zu ermitteln, wenn Du zu A' den Vektor von A nach B, also B-A=(5/5)-(3/5)=(2/0) addierst.

B' ist dann (2,384/4,299)+(2/0)=(4,384/4,299), denn in dem neuen Rechteck A'B'C'D' haben die Punkte relativ zueinander die gleiche Lage wie im ursprünglichen.

Herzliche Grüße,
Willy

Kommentar von Florian366 ,

Vielen Dank.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten