Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

231
Vistas
¿Cómo soluciono esta función JS para que no devuelva falsos positivos al verificar si dos segmentos de línea se cruzan?

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); } };

Dos lineas

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

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);
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda