El código intenta encontrar el punto de intersección de dos segmentos - AB y CD.
Hay muchas maneras diferentes para explicar la forma en que lo está haciendo, dependiendo de cómo se interprete estas operaciones.
Digamos que el punto A tiene coordenadas (xa, ya), B - (xb, yb) y así sucesivamente. Digamos
dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc
El siguiente sistema de dos ecuaciones lineales
| dxAB dxCD | | t | | xc-xa |
| | * | | = | |
| dyAB dyCD | | u | | yc-ya |
si resuelve para ty u, le dará la posición proporcional del punto de intersección de la línea AB (valor t) y en la línea CD (valor u). Estos valores se encuentran en el rango de [0, 1]si el punto pertenece al segmento correspondiente y fuera de ese rango si el punto se encuentra fuera del segmento (en la línea que contiene el segmento).
Con el fin de resolver este sistema de ecuaciones lineales que podemos utilizar la conocida regla de Cramer . Para que vamos a necesitar el determinante de
| dxAB dxCD |
| |
| dyAB dyCD |
que es exactamente determinant(b - a, c - d)desde el código. (En realidad, lo que tengo aquí es determinant(b - a, d - c), pero no es realmente importante para los propósitos de esta explicación. El código que envió por alguna razón intercambia C y D, véase la nota de la EP más abajo).
Y también necesitaremos determinante de
| xc-xa dxCD |
| |
| yc-ya dyCD |
que es exactamente determinant(c-a,c-d)de su código y determinante de
| dxAB xc-xa |
| |
| dyAB yc-ya |
que es exactamente determinant(b-a,c-a).
La división de estos determinantes de conformidad con la regla de Cramer nos dará los valores de ty u, que es exactamente lo que se hace en el código que envió.
El código procede entonces a prueba los valores de ty upara verificar si los segmentos realmente se cruzan, es decir, si ambos ty upertenecen a [0, 1]oscilar. Y si lo hacen, se calcula el punto de intersección real mediante la evaluación a*t+b*(1-t)(que es equivalente, se podría evaluar c*u+d*(1-u)). (Una vez más, consulte la nota de la EP más abajo).
PS En el código original de los puntos D y C se "intercambian" en un sentido que hace el código c - d, donde hago d - cen mi explicación. Pero esto no hace ninguna diferencia para la idea general del algoritmo, siempre y cuando uno de cuidado con los signos.
Este intercambio del punto C y D es también la razón de a*(1-t)+t*bla expresión se utiliza cuando se evalúa el punto de intersección. Normalmente, como en mi explicación, one'd esperar ver algo como a*t+b*(1-t)allí. (Tengo mis dudas acerca de esto, sin embargo. Yo esperaría a ver a*t+b*(1-t)allí, incluso en su versión. Podría ser un error.)
PPS El autor si el código se olvidó de comprobar det == 0(o muy cerca a 0), lo que sucederá en el caso cuando los segmentos son paralelos.