检查两个线段是否发生碰撞(仅检查它们是否相交,而不是相交)

时间:2011-08-15 19:05:05

标签: algorithm math intersection

我需要一个快速算法来检查两条非无限线是否正在交叉。必须快速,因为它会在手机上运行很多。

算法只需要返回是或否,它不必确切地找出线交叉的位置!

我看过这里:How do you detect where two line segments intersect? 但是这个线程是一个丛林,人们一直在说“这就是答案”但是其他两个人说这是错误的,因为这个和那个错误。

请帮我找到一个好的和有效的算法。

为了清楚起见:我需要一个你给的功能...
lineApointAx
lineApointAy
lineApointBx
lineApointBy
lineBpointAx
lineBpointAy
lineBpointBx
lineBpointBy
...并返回true或false,具体取决于两条线是否交叉。

如果您回答(伪)代码而不是公式,我将不胜感激。

2 个答案:

答案 0 :(得分:47)

一段的两端在另一段的不同侧是必要和充分的,反之亦然。要确定一个点在哪一侧,只需采用交叉产品,看它是正面还是负面:

(B x - A x )(P y - B y ) - (B y - y )(P x - B x

修改:
拼写出来:假设您正在查看两个线段,[AB]和[CD]。当且仅当((A和B属于[CD]的不同侧)和(C和D位于[AB]的不同侧)时,这些段相交。)

要查看两个点P和Q是否在线段[EF]的不同侧,计算两个交叉积,一个用于P,一个用于Q:

(F x - E x )(P y - F y ) - (F y - E y )(P x - F x

(F x - E x )(Q y - F y ) - (F y - E y )(Q x - F x

如果结果具有相同的符号(均为正数或均为负数),则忘记它,这些点位于同一侧,这些段不相交。如果一个是正面的而另一个是负面的,则这些点位于相反的一侧。

答案 1 :(得分:9)

如果你有两个给定的点是(X1,Y1)和(X2,Y2),想象两者都是无限的线,而不仅仅是段:

  1. 确定两者的公式(请参阅:http://en.wikipedia.org/wiki/Linear_equation#Two-point_form

  2. 确定两条线的交点(参见:http://zonalandeducation.com/mmts/intersections/intersectionOfTwoLines1/intersectionOfTwoLines1.html

  3. 如果X1&lt; intersectionX&lt; X2和Y1 <交叉点&lt; Y2,然后是,段相交。

相关问题