Der Code versucht, den Schnittpunkt von zwei Segmenten zu finden - AB und CD.
Es gibt viele verschiedene Möglichkeiten, zu erklären, wie es es tut, je nachdem, wie Sie diese Vorgänge interpretieren.
Nehmen wir an Punkt A die Koordinaten (xa, ya), B - (xb, yb) und so weiter. Sagen wir
dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc
Das folgende System von zwei linearen Gleichungen
| dxAB dxCD | | t | | xc-xa |
| | * | | = | |
| dyAB dyCD | | u | | yc-ya |
wenn gelöst für tund u, gibt Ihnen die proportional Position des Schnittpunktes auf der Linie AB (Wert t) und auf der Linie CD (Wert u). Diese Werte liegen im Bereich von , [0, 1]wenn der Punkt gehört zu dem entsprechenden Segment und außerhalb dieses Bereichs , wenn der Punkt außerhalb des Segments liegt (auf der Linie, die das Segment).
Um dieses System von linearen Gleichungen zu lösen wir die bekannte können Cramer-Regel . Dafür müssen wir die Determinante
| dxAB dxCD |
| |
| dyAB dyCD |
das ist genau das determinant(b - a, c - d)aus dem Code. (Eigentlich , was ich habe hier ist determinant(b - a, d - c), aber es ist nicht wirklich wichtig für die Zwecke dieser Erklärung. Der Code , den Sie aus irgendeinem Grunde geschrieben Swaps C und D, PS Anmerkung unten).
Und wir müssen auch Determinante
| xc-xa dxCD |
| |
| yc-ya dyCD |
das ist genau das determinant(c-a,c-d)aus dem Code, und Determinante
| dxAB xc-xa |
| |
| dyAB yc-ya |
was genau ist determinant(b-a,c-a).
Die Aufteilung dieser Determinanten in Übereinstimmung mit der Regel des Cramer wird uns die Werte tund u, das ist genau das, was in dem Code getan wird Sie auf dem Laufenden.
Der Code geht dann die Werte zu testen tund uzu überprüfen , ob die Segmente tatsächlich schneiden, dh ob beide tund ugehören [0, 1]zu reichen. Und wenn sie es tun, berechnet sie den tatsächlichen Schnittpunkt durch die Auswertung a*t+b*(1-t)(äquivalent, könnte es bewerten c*u+d*(1-u)). (Auch hier finden Sie in der PS Anmerkung unten).
PS In dem ursprünglichen Code der Punkte D und C „ausgelagert“ in dem Sinne , dass der Code tut c - d, wo ich d - cin meiner Erklärung. Aber das macht keinen Unterschied für die allgemeine Idee des Algorithmus, solange man die vorsichtig mit Zeichen.
Dieser Swap von C und D Punkt ist auch der Grund für die a*(1-t)+t*bExpression verwendet wird , wenn der Schnittpunkt zu bewerten. Normalerweise, wie es in meiner Erklärung, one'd erwarten so etwas wie zu sehen a*t+b*(1-t)gibt. (Ich habe meine Zweifel , obwohl dies. Ich würde erwarten , um zu sehen , a*t+b*(1-t)gibt es auch in Ihrer Version. Es könnte ein Fehler sein.)
PPS Der Autor , wenn der Code zu überprüfen vergessen det == 0(oder sehr nahe bei 0), die in dem Fall geschehen wird , wenn die Segmente parallel sind.