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 u
in der Gleichung verwenden L=a+t.b
können. Sie müssen eine andere, aber ähnliche Gleichung verwenden, um zu berechnen t
und 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
& 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.
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