【问题标题】:How to tell if two line segments with a non-zero width intersect如何判断宽度非零的两条线段是否相交
【发布时间】:2013-05-19 12:20:39
【问题描述】:

线段可以由一对点定义。有一些众所周知的算法可以确定二维空间中的两条线段是否相交。但是,如果我们通过在线条上添加宽度来让它变得更复杂怎么办?

假设你有一个由一对点宽度定义的线段。你最终得到的是一个矩形,其边不一定与坐标轴对齐。(所以你不能使用标准的“矩形重叠”函数。)确定的最佳方法是什么如果两个这样的线段重叠?

【问题讨论】:

  • 我想这不仅仅是一对线段 - 相反,您正在寻找类似于经典扫描线算法的东西?
  • @Ram:我不熟悉“经典的扫线算法”。
  • 这里有一个链接,来自维基百科。 compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/…
  • 所以我问了这个问题,因为如果你只关心它的两个线段“盒子”,你可以把它当作十六个单独的交集问题,对吧?如果任何两对线相交,则“框”相交。还是我误解了问题所在?

标签: language-agnostic geometry collision-detection


【解决方案1】:

我建议使用The Method of Separating Axes 来确定旋转的矩形(粗线段)是否重叠。这种方法既快速又简单。

【讨论】:

    【解决方案2】:

    一条有宽度的线可以看作是两条平行线,以你所说的宽度分开。因此,每条具有宽度的两条线对应于四条线。只要弄清楚这 4 条线中是否有任何一条相交就完成了,不是吗?

    更新:评论指出这将错过重叠的平行线。我认为这就是它会遗漏的全部内容,因此可以将这种情况作为特殊情况处理。

    【讨论】:

    • 这将错过重叠的平行线。
    • @BevynQ 好点。但我认为这就是它会遗漏的全部内容,所以我编辑了我的答案以包含你的观点。
    • 它也会错过几乎平行的重叠线。
    • @Andrew 我不同意。只要两条线不平行,就会有交点(即使离屏幕很远)。我认为正确使用这些信息总能提供正确的答案。
    • @AndrewC 我很确定我可以编写一些代码,从无限线情况的交点的四边形开始,然后限制到截断部分(即线段)以解决如果两者是否相交,这就是这里的问题所要求的全部。我做的很多编程都是面向数学的。与我过去使用的一些毛茸茸的数值技术相比,这并不难。但我不知道这种方法会有多有效。新的想法,也许轮换会有助于实施。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多