Estoy trabajando en un proyecto de mapeo (con Google Maps SDK). Antes de dibujar un segmento de línea en el mapa, verifico si se cruza con alguna línea existente.
Estoy experimentando una situación en la que el siguiente código informa que los segmentos de línea se cruzan, pero no es así. Aunque, comparten un punto final.
Tal vez esta función de intersect() no está destinada a usarse con coordenadas geográficas y necesito una función diferente. Encontré esta función intersects() aquí: Probar si dos líneas se cruzan - Función JavaScript
En este proyecto tengo alrededor de 150 líneas y alrededor de 10-15 de ellas se detectan como intersecantes, y no lo son (aunque comparten un punto final común con la línea que se informa como intersecante).
A continuación se muestra una captura de pantalla de cómo se dibujan las líneas en Google Maps para una mejor visualización. La línea roja es la segunda que se pasa a la función intersects() y se detecta que se cruza con la primera línea. Curiosamente, si invierto las líneas pasadas a intersects() no encuentra que se crucen.
let crosses = intersects( 39.018223, -76.75899, 39.018387, -76.758773, 39.018387, -76.758773, 39.019813, -76.757388, ); console.log('Intersects:', crosses); // returns true if the line from (a,b)->(c,d) intersects with (p,q)->(r,s) function intersects(a,b,c,d,p,q,r,s) { var det, gamma, lambda; det = (c - a) * (s - q) - (r - p) * (d - b); if (det === 0) { console.log('det is zero'); return false; } else { lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det; gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det; return (0 < lambda && lambda < 1) && (0 < gamma && gamma < 1); } };Es necesario tener en cuenta la precisión numérica. Como se mencionó en un comentario de la publicación, podría probar los puntos finales, pero agregaría mucho más cálculo. Otro método es dar cuenta de la precisión en la prueba final agregando un épsilon a la comparación:
let epsilon = 1e-6; return (epsilon < lambda && lambda < 1-epsilon) && (epsilon < gamma && gamma < 1-epsilon);