Linienschnittpunkt aus der parametrischen Gleichung

7

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?

Sidar
quelle
xn = c sieht ein bisschen aus wie die Punktnormalform einer Ebene (ich kann mir nicht vorstellen, was es sonst sein könnte), warum benutzt du das? Versuchen Sie, den Schnittpunkt einer Linie und einer Ebene zu finden?
Ken

Antworten:

11

Gegeben zwei parametrische Liniengleichungen;

L=a+t.b // t is the paramerter, a & b are vectors
M=c+u.d //u is parameter, c & d are vectors

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.

L=M
a+tb=c+u.d

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.

t=(c+u.d-a)/b

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.

t=(cx+u.dx-ax)/bx  
t=(cy+u.dy-ay)/by

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.

(cx+u.dx-ax)/bx = t = (cy+u.dy-ay)/by  //from above


// equate and isolate u 

(cx+u.dx-ax)/bx=(cy+udy-ay)/by //note: `t` is gone

Jetzt haben wir eine Gleichung mit nur einem Unbekannten, die wir lösen werden, indem wir das verbleibende Unbekannte isolieren. u

cx.by+u.dx.by-ax.by=cy.bx+u.dy.bx-ay.bx
u.dx.by-u.dy.bx=cy.bx-ay.bx-cx.by+ax.by

//result
u=(cy.bx-ay.bx-cx.by+ax.by)/(dx.by-dy.bx)
u=(bx(cy-ay) +by(ax-cx))/(dx.by-dy.bx) //tidied up slightly

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 schneidet

Beachten Sie, dass Sie diesen Wert von nicht uin der Gleichung verwenden L=a+t.bkönnen. Sie müssen eine andere, aber ähnliche Gleichung verwenden, um zu berechnen tund zu überprüfen, ob 0<=t<=1.

//derived in a similar fashion to u 
t=(dx(ay-cy) +dy(cx-ax))/(bx.dy-by.dx) //tidied up slightly

u& that 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.

s1x,s1y // start point of line 1
e1x,e1y // end point of line 1
s2x,s2y // start point of line 2
e2x,e2y // end point of line 2

ax=s1x
ay=s1y

bx=e1x-s1x
by=e1y-s1y

cx=s2x
cy=s2y

dx=e2x-s2x
dy=e2y-s2y
Ken
quelle
Im Grunde genommen isolieren wir zuerst einen Parameter (t). Dann isoliere das andere (u)? was schließlich für die Gleichung von M.
Sidar
@ Sidar, Kinda, ich werde die Antwort bearbeiten, um diesen Schritt klarer zu machen.
Ken
4

Mal sehen, ob ich die Mathematik ein bisschen klären kann.

Sie haben zwei Zeilen:

  • Linie r1so, dass ein Punkt, an p1 = a + L*bdem aein Positionsvektor und bdie Richtung und Lein Parameter ist.
  • Linie r2so, dass ein Punkt, an p2 = c + M*ddem cein Positionsvektor und ddie Richtung und Mein Parameter ist.

Jede Zeile hat einen eigenen Parameter.

Sie möchten herausfinden, wo sich diese schneiden. Am Schnittpunkt , p1 = p2. Sofern r1und r2nicht parallel, müssen einige Werte existieren, für Lund Mfür die dies p1 = p2zutrifft. Sie benötigen nur einen dieser Werte, um den Schnittpunkt zu finden.

Dies ist am einfachsten durch Aufteilen r1und r2von der kartesischen Form in die parametrische Form zu lösen , wobei die x- und y-Koordinaten der Vektoren separat beschrieben werden:

r1ist so, dass p1x = ax + L*bxund p1y = ay + L*by.

r2ist so, dass p2x = cx + M*dxund p2y = cy + M*dy.

Sie können dann die Gleichungen neu anordnen, um entweder Loder zu isolieren und Mfü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.

Anko
quelle