Ich bin sicher, dass diese Frage schon einmal gestellt wurde. Ich versuche jedoch, die Punkte zu verbinden, indem ich eine Gleichung auf Papier in eine tatsächliche Funktion übersetze. Ich dachte, es wäre interessant, hier stattdessen auf den Math-Sites zu fragen (da es sowieso für Spiele verwendet wird).
Nehmen wir an, wir haben unsere Vektorgleichung:
x = s + Lr;
wobei x der resultierende Vektor ist, ist s unser Startpunkt / Vektor. L unser Parameter und r unser Richtungsvektor.
Die (nicht sicher, ob es so heißt, bitte korrigieren Sie mich) normale Gleichung lautet:
x.n = c;
Wenn wir unsere Vektorgleichung ersetzen, erhalten wir:
(s+Lr).n = c.
Wir müssen jetzt L isolieren, was dazu führt
L = (c - s.n) / (r.n);
L muss 0 <L <1 sein. Das heißt, es muss zwischen 0 und 1 liegen.
Meine Frage: Ich möchte wissen, was L ist. Wenn ich also beide Vektorgleichungen (oder zwei Linien) durch L ersetzen würde, sollten sie mir die gleichen Schnittkoordinaten geben. Das ist, wenn sie sich schneiden.
Aber ich kann mich nicht darum kümmern, wie man dies für zwei Linien verwendet und den Parameter findet, der zum Schnittpunkt passt. Könnte jemand mit einem einfachen Beispiel zeigen, wie ich dies in eine Funktion / Methode übersetzen könnte?
quelle
Antworten:
Gegeben zwei parametrische Liniengleichungen;
Der Schnittpunkt ist die einzige Stelle im Raum, an der beide Gleichungen gleich sind (denselben Punkt erzeugen). Wenn sich die Linien bei einem Wert von t und einem Wert von u schneiden, sind die Gleichungen gleich, weil sie sich zum gleichen Punkt auflösen.
Jetzt haben wir eine Gleichung mit zwei Unbekannten (u & t). Um den Schnittpunkt zu finden, benötigen wir mindestens eines der Unbekannten. Der erste Schritt besteht in diesem Fall darin, eines der Unbekannten zu isolieren
t
.Aber dies ist eine 2D-Vektorgleichung, also sind es wirklich zwei Gleichungen, eine in x und die andere in y. Zwei Gleichungen reichen (normalerweise) aus, um ein System mit zwei Unbekannten zu lösen.
Jetzt haben wir also zwei Ausdrücke, die dem gleichen Wert (
t
) entsprechen, also müssen sie einander gleich sein. Deshalb haben wir t isoliert, um zwei Gleichungen zu haben, die einander gleich sind UND nur eine, die auf beiden Seiten unbekannt ist.Jetzt haben wir eine Gleichung mit nur einem Unbekannten, die wir lösen werden, indem wir das verbleibende Unbekannte isolieren.
u
Wenn Sie u berechnen und wieder einsetzen
M=c+u.d
, erhalten Sie den Schnittpunkt der beiden Linien.Natürlich müssen Sie prüfen
0<=u<=1
, ob sich das Liniensegment schneidetBeachten Sie, dass Sie diesen Wert von nicht
u
in der Gleichung verwendenL=a+t.b
können. Sie müssen eine andere, aber ähnliche Gleichung verwenden, um zu berechnent
und zu überprüfen, ob0<=t<=1
.u
&t
hat unterschiedliche Werte für denselben Schnittpunkt, aber wenn beide zwischen 0 und 1 liegen, schneiden sich die beiden Liniensegmente.Beachten Sie, dass wenn
(dx.by-dy.bx)
Null ist, die Linien parallel sind und sich nie schneiden.Übrigens, wenn Sie nur die Start- und Endpunkte der Liniensegmente haben, können Sie diese Gleichungen mit den folgenden Konvertierungen weiterhin verwenden.
quelle
Mal sehen, ob ich die Mathematik ein bisschen klären kann.
Sie haben zwei Zeilen:
r1
so, dass ein Punkt, anp1 = a + L*b
dema
ein Positionsvektor undb
die Richtung undL
ein Parameter ist.r2
so, dass ein Punkt, anp2 = c + M*d
demc
ein Positionsvektor undd
die Richtung undM
ein Parameter ist.Jede Zeile hat einen eigenen Parameter.
Sie möchten herausfinden, wo sich diese schneiden. Am Schnittpunkt ,
p1 = p2
. Sofernr1
undr2
nicht parallel, müssen einige Werte existieren, fürL
undM
für die diesp1 = p2
zutrifft. Sie benötigen nur einen dieser Werte, um den Schnittpunkt zu finden.Dies ist am einfachsten durch Aufteilen
r1
undr2
von der kartesischen Form in die parametrische Form zu lösen , wobei die x- und y-Koordinaten der Vektoren separat beschrieben werden:r1
ist so, dassp1x = ax + L*bx
undp1y = ay + L*by
.r2
ist so, dassp2x = cx + M*dx
undp2y = cy + M*dy
.Sie können dann die Gleichungen neu anordnen, um entweder
L
oder zu isolieren undM
für das andere zu lösen. Die resultierende Gleichung ( Ableitung hier ) lautet ,M = ((cy - ay) * bx - (cx - ax) * by) / (dx * by - dy * bx)
. Sie könnten Ihren Code darum schreiben. Dieses Tutorial kann auch helfen, die Konzepte zu verstehen.quelle