Il codice tenta di trovare il punto di intersezione di due segmenti - AB e CD.
Ci sono molti modi diversi di spiegare come sta facendo, a seconda di come si interpretano queste operazioni.
Diciamo che il punto A ha coordinate (xa, ya), B - (xb, YB) e così via. Diciamo
dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc
Il seguente sistema di due equazioni lineari
| dxAB dxCD | | t | | xc-xa |
| | * | | = | |
| dyAB dyCD | | u | | yc-ya |
se risolti per te u, vi darà la posizione proporzionale del punto di intersezione sulla linea AB (valore t) e sulla linea CD (valore u). Questi valori si trovano nella gamma di [0, 1]se il punto appartiene al segmento corrispondente e al di fuori di tale intervallo se il punto si trova all'esterno del segmento (sulla riga contenente il segmento).
Al fine di risolvere questo sistema di equazioni lineari possiamo utilizzare il noto regola di Cramer . Per questo avremo bisogno il determinante
| dxAB dxCD |
| |
| dyAB dyCD |
che è esattamente determinant(b - a, c - d)dal codice. (In realtà, quello che ho qui è determinant(b - a, d - c), ma non è molto importante ai fini di questa spiegazione. Il codice che avete inviato per qualche ragione scambia C e D, vedi PS nota sotto).
E ci sarà anche bisogno determinante
| xc-xa dxCD |
| |
| yc-ya dyCD |
che è esattamente determinant(c-a,c-d)dal codice, e determinante della
| dxAB xc-xa |
| |
| dyAB yc-ya |
che è esattamente determinant(b-a,c-a).
Dividendo questi determinanti in conformità con la regola del Cramer ci darà i valori di te u, che è esattamente ciò che viene fatto nel codice che avete inviato.
Il codice procede poi per verificare i valori di te uper verificare se i segmenti effettivamente intersecano, cioè se sia te uappartengono [0, 1]gamma. E se lo fanno, si calcola il punto di intersezione effettivo valutando a*t+b*(1-t)(equivalentemente, potrebbe valutare c*u+d*(1-u)). (Di nuovo, vedi nota PS seguente).
PS Nel codice originale i punti D e C sono "scambiati" in un certo senso che il codice fa c - d, dove faccio d - cnella mia spiegazione. Ma questo non fa alcuna differenza per l'idea generale dell'algoritmo, fino a quando uno di attenti con i segni.
Questo scambio di punti C e D è anche il motivo per a*(1-t)+t*bespressione è usata nel valutare il punto di intersezione. Normalmente, come nella mia spiegazione, one'd si aspettano di vedere qualcosa di simile a*t+b*(1-t)c'è. (Ho i miei dubbi su questo però. Mi sarei aspettato di vedere a*t+b*(1-t)lì anche nella versione. Potrebbe essere un bug.)
PPS L'autore se il codice dimenticato di controllare det == 0(o molto vicino a 0), che avverrà nel caso in cui i segmenti sono paralleli.