2010-06-16 10 views
6

Zum Beispiel GetAngle ((0,0), (100,0), (100,100)) = 90. Wie kann ich den Winkel zwischen 3 2D-Punkten finden?Winkel zwischen 3 Scheitelpunkten

+3

Wenn dies eine Mathematik-Website wäre, wäre ich versucht, diese Hausaufgabe zu markieren. ;) Das ist einfache Trigonometrie. http://en.wikipedia.org/wiki/Trigonometry#Common_formulas – Cogwheel

+0

Nein, es ist für ein persönliches Projekt – jmasterx

Antwort

9

Mit den Punkten A, B und C möchten Sie den Winkel zwischen AB und AC? Berechne zuerst die Vektoren AB und AC - es sind nur die Koordinaten von B minus Koordinaten von A und ebenso für AC. Nehmen Sie die dot product der beiden Vektoren. Dies ist nur das Produkt der x-Koordinaten plus das Produkt der y-Koordinaten der Vektoren. Teilen Sie diese Zahl durch die Länge von AB und nochmals durch die Länge von AC. Dieses Ergebnis ist der Kosinus des Winkels zwischen den beiden Vektoren, also nehmen Sie den Arccos() und Sie haben es.

+0

Danke, ich werde dies tun – jmasterx

+1

Von der Frage, ich denke, der gewünschte Winkel ist der zwischen BA und BC –

+0

@Dave Oh Danke :-) – jmasterx

1

das Skalarprodukt Verwendung:

(a,b,c) dot (d,e,f) = ad + be + bf.

A dot B = length(A)*length(B)* cos(theta) 

theta = arccos((A dot B)/(length(A)*length(B)) ist der Winkel zwischen den Vektoren A und B

0

Dies ist einfach, wenn Sie einige grundlegende Kenntnisse der linearen Algebra haben.

Ein Vektor v (im Sinne der linearen Algebra, nicht std :: vector;)) ist ein Tupel v = (x, y, z).

Die Norm ist die Länge des Vektors | v | = Sqrt (x x + y y + z * z)

Das innere Produkt von zwei Vektoren v1 = (x1, y1, z1) und v2 = (x2, y2, z2) ist v1 · v2 = x1 * x2 + y1 * y2 + z1 * z2

der Winkel der Vektoren v1 und v2 ist a = acos (v1 · v2/(| v1 | * | v2 |))

+0

Danke! Ich mag das auch :-) – jmasterx

6

Das Problem bei nur die Verwendung von Punkt Produkt ist hier, dass es in der Nähe von 0 oder 180 Grad instabil ist - die Steigung von acos() nähert sich der Unendlichkeit in der Nähe von +/- 1,0, was dazu führen wird, dass Sie die Präzision verlieren.

Um dies zu beheben, können Sie eine pseudo-Kreuzprodukt berechnen kann, und verwenden Sie atan2() wie folgt:

// given A, B, C are 2D points: 
BA= B - A; CA= C - A // vector subtraction, to get vector between points 
dot= BA.x * CA.x + BA.y * CA.y 
pcross= BA.x * CA.y - BA.y * CA.x 
angle= atan2(pcross, dot) // this should be the angle BAC, in radians 

numerisch robust Dies sollte es sei denn, einer der Schenkel des Winkels der Länge Null hat.

Beachten Sie, dass dies auch einen signierten Winkel ergibt, abhängig davon, ob BAC im Uhrzeigersinn oder gegen den Uhrzeigersinn läuft; Die Methode acos() liefert Ihnen immer einen positiven Wert. Wenn Sie nur einen positiven Winkel wünschen, können Sie natürlich auch abs(angle); Die Methode atan2() wird immer noch robuster und wahrscheinlich schneller sein.

Verwandte Themen