Ich will ein Rechteck rotieren von dem Mittelpunkt aus?

...komplette Frage anzeigen

2 Antworten

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.

Antwort bewerten Vielen Dank für Deine Bewertung
Schachpapa 25.09.2016, 19:26

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

2
Florian366 26.09.2016, 17:03
@Schachpapa

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?

0
Schachpapa 26.09.2016, 17:11
@Florian366

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

1
Florian366 26.09.2016, 17:25
@Schachpapa

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? 

0
Schachpapa 26.09.2016, 17:55
@Florian366
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.
1
Florian366 26.09.2016, 17:57
@Schachpapa

Danke ich probiere gleich aus. 

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

0
Florian366 26.09.2016, 18:06
@Schachpapa

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

0
Schachpapa 26.09.2016, 18:13
@Florian366

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 ...

1

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

Antwort bewerten Vielen Dank für Deine Bewertung
Florian366 26.09.2016, 18:28

Vielen Dank.

1

Was möchtest Du wissen?