如何检查两条线段是否相交?

问题描述:

如何检查两条线段L1(p1,p2)和L2(p3,p4)是否相互交叉?我不需要交点,我只需要知道它们是否相交。由于我的应用程序计算了很多,我需要找到一个快速的解决方案。如何检查两条线段是否相交?

感谢

+1

你是指几何线(无限延伸)? – likeitlikeit 2013-05-02 08:41:44

+0

@ra_htial:我们正在讨论你真正想问什么。请参阅Andreas Wederbrand的回答下的讨论。如果我的编辑未反映您的意图,请重新编辑它。 是关于Java的java.awt.geom.Line2D(根据文档“代表(x,y)坐标空间中的线段”)或延伸到无穷大的几何线的问题? – oligofren 2013-05-02 09:37:13

+0

@ra_htial:你能接受一个答案,或者就你所问的问题进行讨论吗? – oligofren 2013-06-07 07:49:39

要测试两条线段是否相交,可以使用Java的2D API,特别是Line2D的方法。

Line2D line1 = new Line2D.Float(100, 100, 200, 200); 
Line2D line2 = new Line2D.Float(150, 150, 150, 200); 
boolean result = line2.intersectsLine(line1); 
System.out.println(result); // => true 

// Also check out linesIntersect() if you do not need to construct the line objects 
// It will probably be faster due to putting less pressure on the garbage collector 
// if running it in a loop 
System.out.println(Line2D.linesIntersect(100,100,200,200,150,150,150,200)); 

如果你有兴趣找出代码是如何工作的,为了看你是否能在您的特定领域,使其更快,你可以检查出the code for OpenJDK implementation。 但请记住,在进行优化之前,始终需要进行配置。它可能足够快,因为它是。

+2

如果一个也是在交点之后呢? – aaronsnoswell 2013-08-30 07:54:46

+0

对不起,我不明白你在问什么。交点之后是什么? – oligofren 2013-09-06 12:37:24

+2

我认为他的意思是他也想知道这些段相交的地方。顺便说一句,有没有一种方法可以排除线的端点,st。 '(0,0,1,1)'和'(1,1,2,2)'不相交? – 2013-10-10 14:24:35

我会简单地使用它会为你的方法,或者看它的源代码,如果你想重新实现它:Line2D.linesIntersect()

+0

同样在这里,linesIntersect检查行而不是段。并且有很多情况下线条相交但不是线段 – anvarik 2013-05-02 09:42:29

+5

javadoc说:测试从(x1,y1)到(x2,y2)的线段**是否与线段**相交( x3,y3)到(x4,y4)(强调我的)。 – 2013-05-02 09:44:20

+0

马铃薯的神圣母亲:)我的坏,一个投票正在为你们 – anvarik 2013-05-02 09:46:53