簡體   English   中英

如何修復此 JS 函數,使其在檢查兩條線段是否相交時不會返回誤報?

[英]How do I fix this JS function so it doesn't return false positives when checking if two line segments intersect?

我正在開發一個地圖項目(使用 Google Maps SDK)。 在地圖上繪制線段之前,我會檢查它是否與任何現有線相交。

我遇到的情況是下面的代碼報告線段相交,但事實並非如此。 雖然,它們確實共享一個端點。

也許這個intersect()函數不適合與地理坐標一起使用,我需要一個不同的函數。 我在這里找到了這個 intersects() 函數: Test if two lines intersect - JavaScript function

在這個項目中,我有大約 150 條線,其中大約 10-15 條被檢測為相交,而它們不是(盡管它們與被報告為相交的線共享一個公共端點)。

下面是如何在谷歌地圖上繪制線條以獲得更好的視覺效果的屏幕截圖。 紅線是傳遞給intersects()函數的第二條線,並被檢測為與第一條線相交。 有趣的是,如果我反轉傳遞給intersects()的線,它不會發現它們相交。

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

兩條線

您需要考慮數值精度。 正如帖子的評論中提到的,您可以測試端點,但它會增加更多的計算量。 另一種方法是通過在比較中添加一個 epsilon 來計算最終測試中的精度:

let epsilon = 1e-6;
return (epsilon < lambda && lambda < 1-epsilon) &&
       (epsilon <  gamma && gamma  < 1-epsilon);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM