Winkel zwischen zwei Punkten
-
Hi Leute
Also irgendwie krieg ichs nicht gebacken den Winkel zwischen zwei Punkten zu berechnen. Ich betrachte die Punkte (2D) als Vektor.
Ich habe irgendwo gelesen das man zunächst das Skalarprodukt der Punkte berechnen soll und dann den COS aus dem resultierenden Skalar zieht. Richtig ?
Ich verwende folgenden Code:Punkt1.x = 0; Punkt1.y = 10; Punkt2.x = 0; Punkt2.y = -10; // Sollte einen Winkel von 180° ergeben oder ? double nSkalar = (Punkt1.x * Punkt2.x) + (Punkt1.y * Punkt2.y); double dWinkel = cos(nSkalar);
Das kann aber irgendwie nicht alles sein, oder ist komplett verkehrt. Die Werte die da rauskommen sind jedenfalls totaler Mist.
Kann mir mal jemand erklären wie es richtig geht ?
-
Ja geht über Skalarprodukt.
Wenn ich mich richtig erinnere:
Winkel = acos ( (v1 . v2)/(v1-Betrag*v2-Betrag) )
Ach, naja, schon lange her..
keine Garantie..
Zudem weisst Du dann noch nicht ob Winkel + oder - ist..
-
Danke schonmal durito.
Aber kannst du mir das noch erklären ?Winkel = acos ( (v1 . v2)/(v1-Betrag*v2-Betrag) )
(v1 . v2) ist das Skalaprodukt oder ?
Was ist dann v1-Betrag und v2-Betrag ?
Die Länge der beiden Vektoren ?Und warum "acos" ?
(edit)
Ich bin jetzt mal davon ausgegangen, das "Betrag" die Vektor-Länge darstellt.
Ist meine Längenberechnung korrekt ?double dLaenge1 = sqrt((Punkt1.x * Punkt1.x) + (Punkt1.y * Punkt1.y)); double dLaenge2 = sqrt((Punkt2.x * Punkt2.x) + (Punkt2.y * Punkt2.y));
Das ganze Konstrukt bringt aber immernoch keine korrekten Werte
double dWinkel = acos(nSkalar / (nLaenge1 * nLaenge2));
Bringt bei meinem Beispiel einen Wert von 1.5xxxx
Muss man diesen Wert noch irgendwie weiterverarbeiten damit man einen Winkelwert zwischen 0° und 360° bekommt ?
-
Cpp_Junky schrieb:
Winkel = acos ( (v1 . v2)/(v1-Betrag*v2-Betrag) )
(v1 . v2) ist das Skalaprodukt oder ?
Ja.
Cpp_Junky schrieb:
Was ist dann v1-Betrag und v2-Betrag ?
Die Länge der beiden Vektoren ?Ja.
Cpp_Junky schrieb:
Und warum "acos" ?
Weil Du mit cos x/y bei gegebenem Winkel rausbekommst und mit arccos (der Umkehrung von cos) den Winkel bei gegebenem x/y.
-
Ehm, ne, erklären kann ichs nicht *g* War mir nur noch im Kopf weil ich das auch mal brauchte
cos(winkel) = Skalarprodukt/Produkt der Beträge.
Ja mit v1.v2 mein ich das Skalarprodukt. und die Beträge sind die Längen der Vektoren
-
Cpp_Junky schrieb:
Bringt bei meinem Beispiel einen Wert von 1.5xxxx
Muss man diesen Wert noch irgendwie weiterverarbeiten damit man einen Winkelwert zwischen 0° und 360° bekommt ?*360.0/(2*PI)
-
Ok ich habs verstanden glaube ich. Aber die Werte die meinen Winkel darstellen sollen sehen nicht wirklich korrekt aus
Was muss ich mit diesem Wert noch anstellen ? Oder ist mein Code irgendwo falsch ?
-
-
Doch, stimmt schon.
Skalarprodukt: gibt -100
Beträge multipliziert: 100acos(-1.0) = 3.141 = 180.0°
-
Man das geht ja schnell heute
Danke, jetzt hab ichs raus(edit)
Hier nochmal für alle andern die es nicht wissen (oder für die FAQ):double dLaenge1 = sqrt(((Punkt1.x * Punkt1.x) + (Punkt1.y * Punkt1.y))); double dLaenge2 = sqrt(((Punkt2.x * Punkt2.x) + (Punkt2.y * Punkt2.y))); double dSkalar = (double)(Punkt1.x * Punkt2.x) + (Punkt1.y * Punkt2.y); double PI = 3.14159265; double dWinkel = acos(dSkalar / (dLaenge1 * dLaenge2)); dWinkel = dWinkel * (360.0 / (2 * PI));
-
Zwei Punkte definieren keinen Winkel. Dazu brauch man 3.
Bye, TGGC (Pipe my World.)
-
Hab noch ne Frage zum Schluss:
Kann man auch nur aus einem Vektor auch einen Winkel errechnen ?
Also: 180° bei X = 0, Y = 1
oder 90° bei X = 1, Y = 0Geht das dann auch umgekehrt ? Also 180° ergibt Vector(0, 1) ?
-
-
Gibts da was zu essen ?
Ne ne hast schon rechtHab mir jetzt dieses "Computergrafik"-Buch bestellt. Ich hoffe das wird meine Fragen diesbezüglich in Zukunft klären