2016-07-31 93 views
-2

Ich arbeite an etwas 2d Mathe, und ich finde den Winkel, den ich zwischen up(0, 1) und right(1, 0) zu -90 bekommen, die, wenn ich nicht verrückt bin oder hier etwas fehlt, scheint falsch. Ich würde +90 erwarten. Ich hoffe, dass jemand hier helfen kann, mir eine Plausibilitätsprüfung zu geben.2D-Winkel zwischen Vektoren. Negativ für oben und richtig?

Dies ist die Implementierung Ich verwende:

GetAngle(a, b) = atan2(Cross(a, b), Dot(a, b))

wo:

Cross(a, b) = (a.x * b.y) - (a.y * b.x) 
Dot(a, b) = (a.x * b.x) + (a.y * b.y) 
+0

warum nicht einfach: 'Winkel = acos (Punkt (a, b)/(abs (a) * (abs (b))) '? –

+0

Wenn du nach Norden (" oben ") und nach Osten (" rechts ") gehen willst, musst du -90 (gegen den Uhrzeigersinn um einen rechten Winkel) drehen, richtig? –

+0

@AhmedFasih Ja, ich sehe was ich jetzt falsch vermute. Es fühlt sich schrecklich an, als würde man sagen: "Wenn du vorwärts gehen willst, nimm einfach 5 Schritte mit der Fuß-an-Fuß-Regel". Mann, ich muss mein Gehirn auf diesem einen neu verdrahten .... ah! – xoorath

Antwort

1

Es -90 Grad wegen der rechten Hand-Regel sein sollte. Aus Ihrer Berechnung:

a = (0, 1) 
b = (1, 0) 
Cross(a,b) = 0 * 0 - 1 * 1 = -1 = sin(angle) 
Dot(a,b) = 0 * 1 + 1 * 0 = 0 = cos(angle) 

Daher

GetAngle(a,b) = atan2(-1, 0) = -90 degrees 

Beachten Sie, dass atan2(y,x) ist tan^-1(y/x). Ihre Formel für GetAngle basiert auf der Tatsache, dass das Kreuzprodukt als a X b = ||a||||b||sin(angle between a and b) definiert ist und das Punktprodukt als a . b = ||a||||b||cos(angle between a and b)

definiert wird. Hoffe, dies hilft.

+0

Richtig, also wenn ich möchte, dass eine positive Drehung im Uhrzeigersinn ist, muss ich mein Cross-Produkt ändern, um links zu sein, richtig? Gibt es einen guten Grund, warum ich das nicht tun sollte? (Vielleicht ist es nur ich, die durch Rechtshändigkeit in 2d verwirrt ist?) – xoorath

+0

@xoorath könnten Sie dies tun, aber Sie werden gegen Konvention sein (und dabei die Definition für Cross-Produkt ändern). Es ist besser, nur an der akzeptierten Rechtskonvention festzuhalten. – aichao

+0

Macht Sinn. Danke für die Hilfe. – xoorath

0

Ich weiß, das ist eine alte Frage, aber:

Um den Winkel zwischen zwei Vektoren so zu berechnen, dass das Zeichen sagt Ihnen, ob der andere Vektor nach rechts oder links mit (dh negativ, es ist zu links und positiv es ist auf der rechten Seite) können Sie den Unterschied zwischen zwei atan2 berechnen kann und korrigieren Sie dann wie folgt aus:

def angleVec2(d, v): 

    a_1 = math.atan2(d[1], d[0]) 
    a_2 = math.atan2(v[1], v[0]) 

    diff = a_2 - a_1 

    if diff < -math.pi: 
     diff = math.pi-(abs(diff)-math.pi) 
    elif diff > math.pi: 
     diff = -math.pi+(abs(diff)-math.pi) 

    return diff