python判断两线段是否相交_判断两线段是否相交

算法一

1. 快速排斥实验:设一线段P1P2为对角线的矩形为P,设一线段Q1Q2为对角线的矩形为Q,如果P和Q不相交,显然两线段不会相交。

以下2种(方法1、方法2)方法判断矩形是否相交仅限于正矩形。

方法1:已知2个正矩形rect1: {(minx1, miny1), (maxx1,maxy1)}, rect2: {(minx2,miny2), (maxx2, maxy2)},设两个正矩形相交一定得到一个正矩形rect: {(minx, miny), (maxx, maxy)},如果minx > maxx 或 miny > maxy则该2个正矩形rect1和rect2不相交。

方法2:两个正矩形的重心距离在X和Y轴上都小于两个矩形长或宽的一半之和。

方法3:如果是非正矩形,那么需要矩形的每个边与另一个矩形每一条边判断是否相交,并且包含关系来判断矩形是否相交。如果不希望计算也可以递归使用本章节计算方法(快速排斥实验+跨立实验)。在计算线段是否相交的时候转换为正矩形是否相交,通过比较来实现矩形是否相交。

2.跨立实验:如果2个线段相交,则两个线段必然互相跨立对方。若P1P2的跨立Q1Q2,则矢量(P1-Q1)和(P2-Q1)位于(Q2-Q1)的两侧,(通过矢量叉积判断拐向)即 (P1-Q1)x(Q2-Q1)x(P2-Q1)x(Q2-Q1) < 0,通过交换律可得 (P1-Q1)x(Q2-Q1)x(Q2-Q1)x(P2-Q1) > 0。当(P1-Q1)x(Q2-Q1) = 0时,说明(P1-Q1)和(Q2-Q1)共线,因为已经通过了快速排斥,所以P1一定是在Q1Q2上。同理Q2-Q1)x(P2-Q1) = 0,则P2一定是在Q1Q2上。综上P1P2和Q1Q2互相跨立:

1.(P1-Q1)x(Q2-Q1)x(Q2-Q1)x(P2-Q1) ≥ 0

2.(Q1-P1)X(P2-P1)x(P2-P1)x(Q2-P1) ≥ 0

算法二

定义A、B、C、D是二维空间点,则有向线段AB、CD的参数方程:

AB = A + r(B-A), r ∈[0,1]

CD = C + s(D-C), s ∈[0, 1]

导出:

r = ((Ay-Cy)(Dx-Cx) - (Ax-Cx)(Dy-Cy))/((Bx-Ax)(Dy-Cy) - (By-Ay)(Dx-Cx))

s= ((Ay-Cy)(Bx-Ax) - (Ax-Cx)(By-Ay))/ ((Bx-Ax)(Dy-Cy) - (By-Ay)(Dx-Cx))

定义:设P维直线AB和CD的焦点,则P = (PX, PY) = (Ax+r(Bx-Ax), Ay+r(By-Ay)),如果0≤r≤1并且0≤s≤1,则有向线段AB和CD的焦段存在,否则焦点不存在。

若((Bx-Ax)(Dy-Cy) - (By-Ay)(Dx-Cx)) = 0,则AB和CD平行。

若 ((Ay-Cy)(Dx-Cx) - (Ax-Cx)(Dy-Cy)) = 0,则AB和CD共线。

若直线AB和CD相交,而交点不在线段AB和CD之间,则焦点位置可通过如下判断:

1. 若r > 1, 则交点P位于有向线段AB的延迟线上。

2.若r < 0,则焦点P位于有向线段BA延长线上。

3.若s > 1,则交点P位于有向线段CD的延迟线上。

4.若s < 0,则交点P位于有向线段DC的延迟线上。

你可能感兴趣的:(python判断两线段是否相交)