Kód se pokusí najít průsečík dvou segmentů - AB a CD.
Existuje mnoho různých způsobů, jak vysvětlit, jak se to dělá, v závislosti na tom, jak tyto operace interpretovat.
Řekněme, že bod A má souřadnice (xa, ya), B - (xb, yb) a tak dále. Řekněme
dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc
The následující systém dvou lineárních rovnic
| dxAB dxCD | | t | | xc-xa |
| | * | | = | |
| dyAB dyCD | | u | | yc-ya |
pokud vyřešena pro ta u, vám poměrnou polohu průsečíku na lince AB (hodnoty t) a na řádku CD (hodnota u). Tyto hodnoty leží v rozmezí [0, 1], pokud je bod patří k odpovídajícímu segmentu a mimo tento rozsah, pokud je bod leží mimo segment (na řádek obsahující segment).
Za účelem vyřešení této soustavy lineárních rovnic můžeme použít známé pravidlo Cramerovo . K tomu budeme potřebovat determinant
| dxAB dxCD |
| |
| dyAB dyCD |
což je přesně to, determinant(b - a, c - d)z kódu. (Ve skutečnosti to, co mám tady je determinant(b - a, d - c), ale není to opravdu důležité pro účely tohoto vysvětlení. Kód, který jste vyslán z nějakého důvodu prohodí C a D, viz poznámka PS níže).
A budeme potřebovat determinant
| xc-xa dxCD |
| |
| yc-ya dyCD |
což je přesně to, determinant(c-a,c-d)z kódu a determinant
| dxAB xc-xa |
| |
| dyAB yc-ya |
což je přesně to determinant(b-a,c-a).
Dělení těchto faktorů v souladu s pravidlem Cramerova nám dá hodnoty ta u, což je přesně to, co se děje v kódu, který vyslán.
Kód pak pokračuje k testování hodnot ta upro kontrolu, zda jsou segmenty skutečně protínají, tedy zda oba ta upatří do [0, 1]rozmezí. A pokud ano, tak vypočte skutečný průsečík vyhodnocením a*t+b*(1-t)(ekvivalentně, mohlo by to posoudit c*u+d*(1-u)). (Opět viz PS poznámka níže).
PS V původním kódu body D a C jsou „vyměnili“ v tom smyslu, že kód dělá c - d, kde dělám d - cve svém vysvětlení. Ale to nezáleží na obecnou představu o algoritmu, tak dlouho, dokud jeden je opatrný s příznaky.
Tato výměna z C a D bodu je také důvod pro a*(1-t)+t*bexpresi se používá při hodnocení průsečík. Za normálních okolností, jako v mém vysvětlení, one'd očekávat, že něco takového a*t+b*(1-t)existuje. (Mám pochybnosti o tom ačkoli. Očekával bych vidět a*t+b*(1-t), že i ve verzi. Mohl by to být chyba.)
PPS Autor pokud kód zapomněli zkontrolovat det == 0(nebo velmi blízko k 0 ° C), která se stane v případě, že segmenty jsou rovnoběžné.