Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

225
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!