2016-06-21 38 views
2

這兩行是有效的點,但是當我運行lineIntersects方法時,我將「true」作爲返回值,是否有人知道發生了什麼或者這是一個錯誤?這裏是documentation link,這裏是source,當這可能失敗時,它們都沒有提到特殊情況。Java Line2D linesIntersect broken

import java.awt.geom.*; 
public class Test { 
    public static void main(String[] args) { 

    //        x1, y1, x2, y2 
    Line2D l1 = new Line2D.Double(1.0, 1.0, 1.0, 1.0); 
    Line2D l2 = new Line2D.Double(2.0, 2.0, 2.0, 2.0); 

    System.out.println(l1.intersectsLine(l2)); // true 

    } 
} 

FYI我運行Java版本「1.8.0_74」

回答

2

The Oracle Java test uses cross products確定各段的端點是否跨越,其他部分被嵌入在無限行。如果這是真的,那麼線說相交。

問題是對於重合的端點,交叉產品退化爲零,並且在跨點乘積爲零的情況下,「跨坐」測試全部返回true,

因此,作爲輸入提供的兩點總是返回true。

幾何解釋是由兩個重合點定義的「線」是總是跨越任何其他點對。因此兩條零長度的線具有跨越彼此的端點。

這可能不直觀,但它是一致的。許多幾何算法在退化方面做了一些古怪的事情。如果您不喜歡這種行爲,請包裝該功能並返回所需內容。

+0

此外,Java的Line2D類接受「線段」,根據定義,它使用兩個不同的點形成。儘管如此,我仍然認爲java做了一個馬虎的工作讓這個邊緣案例得以實現。 –

+0

@ will.fiset真的他們所做的錯誤都是未能記錄退化段的未定義行爲。精確的浮點比較幾乎是無用的,而做任何基於epsilon的計算都相當昂貴,並且不可能幫助大多數用戶。 – Gene