【问题标题】:Determine if two lines intersect判断两条线是否相交
【发布时间】:2013-08-14 14:08:50
【问题描述】:

我在 stackoverflow 上看到了很多帖子,它们都在讨论这个话题。我从stackoverflow中获取了一个解决方案,但我找不到帖子。也就是说:如果两条线相交,那么叉积对于左侧和右侧会产生两个不同的结果。一正一负。否则两者具有相同的符号。到目前为止还好。 使用的公式是,其中 AB 是一条线,CD 是另一条线。

dotproductleft = (B.x-A.x)(C.y-B.y)-(B.y-A.y)(C.x-B.x)

dotproductright = (B.x-A.x)(D.y-B.y)-(B.y-A.y)(D.x-B.x)

如果我为以下给定的 GPS 坐标计算此值,我会得到一个交叉点,在不可能交叉的情况下。

A:x:15.4433917 y:47.0697272

B:x:15.4433661 y:47.0697722

C: x: 15.4434363 y: 47.0696776

D:x:15.442966 y:47.0700098

如果我在 Google Maps Engine 上绘制它,我可以看到这些线之间肯定没有交集。

dotproductleft 的结果:-7.372399999828474E-10 和 dotproductright 的结果:1.1921940000328E-8

它在其他示例中运行良好,但在这里我发现它无法正常运行。但我没有发现公式中有任何错误。

【问题讨论】:

  • The post you mention,供参考。
  • 是吗?这似乎说明了一些不同的事情
  • 不,这不是我要找的参考。但雅各布的回答带来了一个想法。
  • 您知道,AB 和 CD 之间的点积是(B.x-A.x)*(D.x-C.x) + (B.y-A.y)*(D.y-C.y)

标签: math geometry intersection line-intersection


【解决方案1】:

包含任何线段(例如 AB 和 CD)的 线 将始终相交(除非它们平行)。

您想检查线段是否相交。这很容易通过找到交点并检查它是否位于两条线段上来完成。

因此,使用您的示例,两条线(线段 AB 和 CD 所在的线)相交于 P = (15.4434,47.0697)。现在,如果 P 位于 AB 上,那么 PAPB 的点积为负(因为 PA之间的夹角> 和 PB 是 180° 和 cos(180°)=-1)。

如果你计算 PA 和 PB 的点积,你会得到一个正数(因此它位于 AB 上)。但是,PC 和 PD 的点积会给你一个负数(因此它位于 CD 上)。

因此,如果上述点积(与交点)为负,则可以检查线段是否相交。

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多