确定两条线是否相交

时间:2013-08-14 14:08:50

标签: math geometry intersection line-intersection

我在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坐标计算得到这个值,我会得到一个交叉点,在没有交叉点的情况下。

  

答: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 points on Google Maps

1 个答案:

答案 0 :(得分:7)

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

您想要检查线段是否相交。通过找到交点并检查它是否位于两个线段上,这很容易做到。

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

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

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