[C++] 2D - Linie um ihren Endpunkt drehen [gelöst]

Hallo!
Ich beschäftige mich gerade ein wenig mit zweidimensionalen Objekten.
Leider habe ich ein Problem eine Linie um ihren eigenen Endpunkt zu drehen. Dh. es sind x1/y1 sowie x2/y2 gegeben und die Linie soll um den Punkt x1/y1 gedreht werden. Dazu sollen dann die neuen Koordinaten für x2/y2 berechnet werden.
Leider stimmt irgendetwas an meinen Berechnungen nicht und die Linie wird immer viel zu lang und wurde auch nicht um den richtigen Winkel gedreht...

Hier mein Code:
Code:
void Turn_Line(int number, double alpha)
{
	//Laenge der Linie berechnen
	double dx = line[number].x2 - line[number].x1;
	double dy = line[number].y2 - line[number].y1;
	if (dx<0) dx= dx*-1;
	if (dy<0) dx= dy*-1;
	double lenght;
	if (dx!=0 && dy!=0) lenght = sqrt(dx*dx / dy*dy);
	else if (dy==0) lenght=dx;//Pruefen, ob es eine Vertikale
	else if (dx==0) lenght=dy;//oder Horizontale sein koennte

	//Beta berechnen
	double beta = (180-alpha)/2;

	//Laenge der Verschiebung berechnen
	double AB = 2*(sin(beta)*lenght);

	//X und Y Verschiebung berechnen
	double ymov = sin(beta)*AB;
	double xmov = cos(beta)*AB;
	line[number].x2+=xmov;
	line[number].y2-=ymov;
}
Zur veranschaulichung eine kleine Skizze im Anhang.
 
Also ich kenne zwar Vektorrechnung und die Berechnung des Winkels zwischen zwei Geraden im Raum, aber von Drehmatrizen höre ich zum ersten mal. :/
Das war ja schließlich mein Grund es geometrisch zu lösen.

In der ersten Stufe kann ich den Endpunkt ja einfach als Ursprung auffassen.
Danach berechne ich die Differenz zwischen den beiden Punkten, um die Koordinate in meinem "gedachtem Koordinatensystem" zu erhalten. Dann wende ich die Drehmatrix an, um die gedrehten Koordinaten im gedachten System zu erhalten. Die Differenz wende ich dann auf das richtige Koordinatensystem an.
Ich bin mir jetzt aber nicht sicher, ob ich das soweit richtig verstanden habe und weis auch nicht, wie ich das umsetzen soll. X(
 
Ja, im Grunde hast du das richtig verstanden.

Du hast mit der Translation folgende Formel:

1e51ee459c6afc23fe52d4c676cf6a15.png


Die Matrixmultiplikation bringt dir an der Stelle eigentlich nur folgende Formel (steht auch auf der Wikipedia):

Code:
x_neu = x_alt * cos(a) - y_alt * sin(a)
y_neu = y_alt * cos(a) + x_alt * sin(a)
Da du ja eine Drehung um den zweiten Punkt machst, musst du die x/y-Werte als Differenzen interpretieren und daher zweimal eine Translation machen (einmal vorher und einmal hinterher in die andere Richtung).
Angenommen, du willst Punkt 2 (x2/y2) um Punkt 1 (x1/y1) drehen, dann bleibt der Punkt 1 (natürlich) konstant und die neuen Koordinaten für Punkt 2 ergeben sich so:

Code:
x2_neu = (x2_alt - x1_alt) * cos(a) - (y2_alt - y1_alt) * sin(a) + x1_alt
y2_neu = (y2_alt - y1_alt) * cos(a) + (x2_alt - x1_alt) * sin(a) + y1_alt
mfg, metax.
 
Super, danke!
Habe es jetzt verstanden und umsetzen können. Dort lassen sich jetzt auch die x1_alt und y1_alt durch die Koordinaten eines beliebigen Angelpunktes ersetzen um den der gewünschte Punkt gedreht werden soll (Quasi das Weglassen der Stufe 1).
Damit ist das Problem gelöst. :)
 
Zurück
Oben