Suchen Sie einen Einheitsvektor genau auf halber Strecke zwischen zwei verbundenen Liniensegmenten


8

Scheint eine schnelle und einfache Frage zu sein, aber ich konnte nicht genau das finden, wonach ich suche:

Wie berechnet man einen Einheitslängenvektor, der entlang der Linie zeigt, die genau 50% des Winkels zweier verbundener Liniensegmente entspricht?

Ein Bild sagt mehr als tausend Worte (das ist auch besser als meine Erklärung!). Beispiel eines Einheitsvektors, der zwei verbundene Liniensegmente halbiert
Im Grunde möchte ich den blauen Einheitsvektor anhand der beiden roten Liniensegmente berechnen (die eigentlich 3 Punkte sind und daher garantiert miteinander verbunden sind).

Die roten Segmente haben eine beliebige Länge und das Ergebnis muss keine Einheit sein, es wäre einfach einfacher für mich.
Es wäre auch praktisch, eine Möglichkeit zu haben, den resultierenden Vektor zu zwingen, in eine bestimmte Richtung zu zeigen (relativ zu den Eingabesegmenten). Dies ist nicht unbedingt erforderlich, da ich denke, dass ich dieses herausarbeiten kann - da sich letztendlich die Eingabezeilensegmente bilden ein n-gon.

Alle Beispiele wären in C ++ ideal, aber andere Sprachen sind willkommen.

Vielen Dank für Hinweise.

Antworten:


13

Erstellen und normalisieren Sie zwei Vektoren aus Ihrem roten Segment, beginnend mit ihrem gemeinsamen Scheitelpunkt, und fügen Sie dann die Ergebnisse hinzu (Komponente für Komponente). Dann können Sie die Ausgabe normalisieren, wenn Sie einen Einheitsvektor erhalten möchten.

Das Problem ist, dass Sie am Ende immer der zweite Fall sind, da der Winkel zwischen zwei Vektoren immer kleiner als 180 ° ist. Aber dann können Sie natürlich einfach den entgegengesetzten Vektor erstellen und sehen, welcher besser zu Ihrem Zweck passt.

Es gibt auch einen Sonderfall, wenn beide Vektoren ausgerichtet sind und der Durchschnitt 0 ist (aber Sie können ihn leicht erkennen).


Ausgezeichnet Ich denke, das ist genau das, wonach ich suche! Ich wusste, dass es einfach war :) Ich werde es offen lassen, nur um zu sehen, welche anderen Antworten ich bekomme ... Danke
Adam Naylor

Ich wollte gerade eine komplexere Methode mit dem Punktprodukt schreiben, obwohl ich diese einfache Methode schon einmal verwendet habe, doh!
CiscoIPPhone

Was meinst du mit "Das Problem ist, dass du immer am Ende der zweite Fall bist"?
CiscoIPPhone

@ CiscoIPPhone Ich glaube, er bezieht sich auf mein Diagramm. Eine Dot-Produktlösung ist mehr als willkommen. CiscoIPPhone, zumindest gebe ich ihr eine +1 :)
Adam Naylor

In der Tat bezog ich mich auf Ihr Bild. Mit einem Punktprodukt können Sie den Winkel zwischen den beiden Vektoren ermitteln, der jedoch wieder unter 180 ° bleibt.
XGouchet

1

Ich denke, Sie können die Richtung konsistent machen, indem Sie dies so behandeln, als würden Sie eine 2D-Scheitelpunktnormalen erzeugen. Das ist:

  1. Nehmen Sie jeden der roten Vektoren, tauschen Sie die x- und y-Komponenten aus und negieren Sie eine davon, um die Normalen zu erstellen.

  2. Normalisiere sie.

  3. Summiere diese beiden Vektoren und renormiere sie.

Sie möchten wahrscheinlich auch testen, ob sich die beiden roten Linien überlappen - die endgültige Renormierung versucht dort, durch Null zu teilen.


Danke Adam, hat dieser Ansatz einen Namen? Ich würde es gerne weiter untersuchen ...
Adam Naylor

Nicht, dass ich davon Wüste. Der normale Trick der Vektorerzeugung
Adam

0

Lassen Sie A und B Ihre Vektoren sein:

Ergebnis

Die Summierungsvektoren müssen keine Einheitsvektoren sein, sondern sind einfach gleich lang, wenn | A | > = | B | können Sie:

äquivalentes Ergebnis

Das ist numerisch stabiler, da Sie nur einen Bruchteil und den größeren Nenner haben

wie Summe funktioniert

Das gleiche Ergebnis kann durch Subtraktion erhalten werden, wiederum müssen die Vektoren gleich lang sein

Dies funktioniert nur für nicht konvexe Winkel. Sie können einfach testen, ob Ihr Winkel konvex ist, und H mit -1 multiplizieren


Ich denke nicht, dass dies funktionieren wird, wenn | A | ! = | B | ... betrachten Sie A = [0,1] B = [100,0], das Ergebnis ist nicht [.707, .707]
Richard Fabian

@ Richard Fabian Du hast recht, ich habe die Dreiecksungleichung vergessen!
FxIII
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.