【问题标题】:How to check whether 2 lines segments intersect?如何检查2条线段是否相交?
【发布时间】:2013-05-02 08:36:58
【问题描述】:

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

谢谢

【问题讨论】:

  • 你指的是几何线(无限延伸)吗?
  • @ra_htial:我们正在讨论您真正要问的问题。请参阅 Andreas Wederbrand 的回答下的讨论。如果我的编辑不能反映您的意图,请重新编辑。您的问题是关于 Java 的 java.awt.geom.Line2D(根据文档“表示 (x,y) 坐标空间中的线段”)还是延伸到无穷大的几何线?
  • @ra_htial:你能接受一个答案或就你所问的问题提出一些问题吗?

标签: java math


【解决方案1】:

测试两条线段是否相交,可以使用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。 但请记住,在优化之前始终进行配置;它可能已经足够快了。

【讨论】:

  • 对不起,我不明白你在问什么。交点之后是什么?
  • 我认为他的意思是他也想知道这些段相交的位置。顺便说一句,有没有办法可以排除线条的端点,st。 (0,0,1,1) 和 (1,1,2,2) 不相交?
  • @AlessioMTX 这是另一个问题。我会先尝试阅读 API 方法...
  • 在Line2D中没有找到,由于不知道这个API,所以看了一下,没找到解决办法,所以在这里问,可能漏掉了。
  • @AlessioMTX 谷歌第一击:stackoverflow.com/questions/16314069/…
【解决方案2】:

我会简单地使用为您执行此操作的方法,或者如果您想重新实现它,请查看其源代码:Line2D.linesIntersect()

【讨论】:

  • 这里也是一样,linesIntersect 检查的是线条而不是线段。并且有很多情况是线相交而不是线段
  • javadoc 说:测试从 (x1,y1) 到 (x2,y2) 的线 segment 是否与 (x3) 的线 segment 相交,y3) 到 (x4,y4)(强调我的)。
  • 马铃薯的圣母 :) 我的错,一票投给你们
猜你喜欢
  • 2013-01-03
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2014-11-07
  • 2019-01-24
相关资源
最近更新 更多