Wie berechnen Sie, ob 2 Linien nach vorne oder weg zeigen?


10

Wie berechnen Sie angesichts der 4 Punkte, die 2 Liniensegmente beschreiben, ob Linie A in Richtung Linie B oder von Linie B weg verläuft?

Die 2 Linien haben eine feste Länge und können als Abstand von x1 / y1 bis x2 / y2 gemessen werden.

Geben Sie hier die Bildbeschreibung ein


Wie unterscheidet sich der Fall mit der Bezierkurve von dem Fall mit geraden Linien? Haben Sie eine Kurve, die die andere Linie vollständig einschließen könnte (so dass jede Richtung "in Richtung" zeigt)?
Bummzack

1
Sie müssen wahrscheinlich Ihre Bedingungen klären. In der Geometrie erstreckt sich eine "Linie" unendlich in beide Richtungen, im Gegensatz zu einer halben Linie oder einem Segment. Daher kreuzen sich immer zwei Linien, es sei denn, sie sind parallel. Nach welchem ​​fragst du? Sie haben einen Pfeil gezeichnet, der eine Richtung impliziert, was für mich ein Segment oder höchstens eine halbe Linie impliziert. Und was ist Ihre Definition von "in Richtung" und "weg"?
Hackworth

Die Bezier-Kurve ist möglicherweise schwieriger in der Gleichheit darzustellen, die zum Lösen eines Strahllinien-Schnittpunkttests erforderlich ist. Übrigens würde ich das Wort, das Ihren Pfeil darstellt, in "Strahl" ändern. Möglicherweise erhalten Sie eine schnellere Antwort. Ich werde darauf antworten, wenn ich während des Mittagessens Zeit habe, wenn es sonst niemand tut. Wenn nicht, ist dies eine äußerst häufige Aufgabe in Spielen. Google "Ray Liniensegment-Schnittpunkttest". Ich vermute, dass der Bezier-Kurventest ähnlich ist, aber ich habe es nie versucht.
Brandon

3
Sie sollten Ihre Frage in zwei Teile teilen. Das Teil mit Liniensegmenten ist sehr einfach. Der Teil mit Bezierkurven ist äußerst komplex und hat nur eine ungefähre numerische Lösung.
Sam Hocevar

Ich habe meine Frage wie gewünscht in 2 geteilt. Der zweite Teil ist hier: gamedev.stackexchange.com/questions/21463/...
Robinicks

Antworten:


11

Sei Aund Bsei zwei Punkte auf der schwarzen Linie. Lass Cund Dsei dein blaues Segment. Das Vorzeichen der zKoordinate des Kreuzprodukts AB^ACgibt an, ob C"links" oder "rechts" von der schwarzen Linie ist. In ähnlicher Weise gibt Cross Product an AB^CD, ob CD"links" oder "rechts" von der schwarzen Linie gesteuert wird.

Wir wollen nicht wirklich wissen, ob es links oder rechts ist; Wir wollen nur sicherstellen, dass sie die gleiche oder die entgegengesetzte Richtung haben. Deshalb multiplizieren wir die beiden Werte.

Der folgende Pseudocode sollte daher funktionieren:

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

Ich fürchte, ich brauche etwas Zeit, um eine richtige Lösung für die Bezier-Kurve zu schreiben. Ist die folgende Situation in Richtung oder weg?

Problem?


Ich glaube, Sie können für die Kurve die Tangente der Kurve an dem Punkt finden, der Ihrem Liniensegment am nächsten liegt, und diese auf die gleiche Weise verwenden, wie Sie Ihre anderen Liniensegmente testen. Wahrscheinlich etwas schwieriger als es sich anhört :)
Notlesh

@stephelton: Sehen Sie sich noch einmal das zweite Bild für die Bezierkurven an und zeigen Sie auf eine Kurve, die sich weg krümmt. Oder betrachten Sie eine Kurve mit einer Tangente parallel zum möglicherweise sich kreuzenden Segment, die sich jedoch zum Segment hin krümmt und schneidet.
Cascabel

+1 für das Trollface und gute Mathematik :). Ihr 'Richtung'-Diagramm hat jedoch immer noch ein' Weg '- verschieben Sie einfach den Startpunkt über die Linie.
Jonathan Dickinson

@ JonathanDickinson danke, ich habe das Bild aktualisiert, um etwas klarer zu machen, was meine Befragung ist!
Sam Hocevar

2

Angenommen, Startpunkt ist der grüne Kreis und Endpunkt ist der rote Pfeil

Berechnen Sie den Abstand zwischen dem Startpunkt als DS und dem schwarzen Segment und machen Sie dasselbe für den Endpunkt (roter Pfeil) wie DE. Wenn DS> DE, zeigt das Segment in Richtung. Wenn DE> DS, zeigt es weg. Wenn beide gleich sind, sind die beiden Parallelen.

Sie können feststellen , wie die Entfernung von einem Punkt zu einem Segment berechnen hier , und eine quadratischen Bezier - Kurve hier . Abhängig von der Form der Bezierkurve kann es jedoch zu seltsamen Ergebnissen kommen (die Kurve kann sich selbst kreuzen).


DS> DE funktioniert garantiert nur für gerade Linien. Es kann für Beziers scheitern. Außerdem kennen Sie seine Definition von "Richtung" nicht. Wenn die Verlängerung des Pfeils eine durch 2 Punkte definierte Linie kreuzen würde, aber nicht das durch dieselben Punkte definierte Segment , ist sie dann immer noch "in Richtung"?
Hackworth

Ich spreche von zwei Segmenten, nicht von Linien, daher gibt es keine "Erweiterung des Pfeils". Es spielt auch keine Rolle, wohin der Pfeil zeigt, da es sich hier um Entfernungen handelt. Der nächstgelegene Punkt auf der schwarzen Linie könnte ein Start- / Endpunkt der schwarzen Linie sein, es spielt keine Rolle. Die beiden Segmente könnten kollinear sein, diese Methode würde immer noch wie beabsichtigt funktionieren. Für Bezierkurven, die ich erwähnt habe, würde dies je nach Form der Kurve seltsame Ergebnisse liefern.
Ravachol
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.