Bestimmen, ob ein 2D-Vektor, der rechts oder Links von einem anderen
Gegeben seien zwei 2D-Vektoren, wie können Sie sagen, ob die zweite nach rechts (im Uhrzeigersinn) von der ersten, oder nach Links (gegen den Uhrzeigersinn)?
Beispielsweise in diesen Diagramm B ist auf der rechten Seite (gegen den Uhrzeigersinn) Eines
A B . .----> A
^ ¬ |\ |
| / | \ |
|/ V \ V
. B A B
InformationsquelleAutor Eric | 2012-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erreichen dies mit einem Skalarprodukt.
dot(a, b) == a.x*b.x + a.y*b.y
können verwendet werden, um herauszufinden, ob Vektoren senkrecht zueinander stehen:Setzen eine andere Weise.
dot > 0
sagt Sie, wenna
ist "vor"b
.Übernehmen
b
ist auf der rechtena
. Rotierendeb
90 Grad gegen den Uhrzeigersinn macht es vor dera
.Nehmen Sie jetzt
b
ist auf der linken Seite dera
. Rotierendeb
90 Grad gegen den Uhrzeigersinn legt es hintera
.Daher, die Zeichen der
dot(a, rot90CCW(b))
erfahren Sie, ob b auf der rechten oder linken Seite ein, worot90CCW(b) == {x: -b.y, y: b.x}
.Simplyifying:
Nein, B soll noch auf der rechten Seite, wenn Sie reverse beide. Ich denke, die Frage ist "wenn Einer zeigt nach vorn, der Seite, es ist b auf"
Wäre es nicht einfacher, nur über das Kreuz-Produkt direkt? Sie beginnen mit dem Punkt-Produkt, aber Sie schließlich am Ende mit einem cross-Produkt (oder zumindest Ihre norm).
InformationsquelleAutor Eric
In der Klärung in einem Kommentar von @Eric, "wenn Einer zeigt nach vorn, der Seite, es ist B?"
In dieser Formulierung die Antwort ist tot-ganz einfach. "A" zeigt nach vorn, wie in dem Beispiel, wenn seine x-Koordinate ist null. Mit dieser Annahme, "B" ist auf der rechten Seite, wenn seine x-Koordinate positiv ist, ist auf der linken Seite, wenn negativ, und ist weder bei null.
Ausweitung dieser Klarstellung zu "A" im Allgemeinen position bedeutet, dass die Einführung einer neuen Koordinatensystem, wie folgt: "In einem Koordinatensystem, wo Einer zeigt nach vorn, ...". Die einfachste, neue Koordinatensystem, in dem der basis-Vektoren sind
A
und(1,0)
. (Wenn A ein Vielfaches von(1,0)
, dann ist es nur eine 90-Grad-Drehung der grundlegenden situation.) Die Koordinatentransformation istL : P = (P_x, P_y) --> P' = (P'_x, P'_y) = (A_y * P_x - A_x * P_y, P_y)
. Diese Art der linearen transformation wird als skew-transformation. Der test ist das Vorzeichen der KoordinateP'_x
. Überprüfen Sie, dass L nimmt der Vektor (0,1) in das neue Koordinatensystem. Diese Methode verwendet die gleichen Arithmetik wie die andere Antwort.Ich schrieb dies, so dass der tiefere geometrische Inhalte kann erhellend sein.
InformationsquelleAutor eh9
@Eric es ist ein grundlegendes problem allerdings mit Ihr Skalarprodukt, wenn die Vektor-Größen stark variieren.
var dot = ein.x*-b.y + a.y*. b.x;
Wenn ein(2,-2) und b(-500,-500) eindeutig B ist Links von a, aber tut das dot-Produkt kommt es zu größer als 0.
Ich habe versucht, aber konnte nicht mit weniger als 50 rep..
Nein, b ist auf der rechten Seite (im Uhrzeigersinn), der hier vorausgesetzt wird ein rechtshändiges Koordinatensystem
InformationsquelleAutor Gab