判斷平面上任意兩條線段是否相交 Python實現

2021-08-13 17:39:19 字數 1872 閱讀 6179

判斷兩線段是否相交:

步驟一:快速排斥

即判斷以兩線段為對角線的矩形是否相交,若不相交,則兩線段一定不相交

而判斷兩個矩形是否相交,只要任一矩形的最右端都大於另一矩形的最左端且任一矩形最高端大於另一矩形的最低端,則兩矩形相交;反之,若其中任一條件不滿足,兩矩形不相交。

步驟二:跨立實驗(p3

若出現(p3

p1−→

−−×p

3p4−

→−−)

=0,則p3

p1−→

−−與p3p

4−→−

− 共線,但因為已通過跨立實驗,所以p1

p3p4 上。

所以判斷線段p1p2跨立線段p3p4的條件是(p

3p1−

→−−×

p3p4

−→−−

)⋅(p

3p2−

→−−×

p3p4

−→−−

)≤0

同理可得,線段p3p4跨立線段p1p2的條件是(p

2p3−

→−−×

p2p1

−→−−

)⋅(p

2p4−

→−−×

p2p1

−→−−

)≤0

因此,判斷兩線段相交,需要同時滿足快速排斥和跨立實驗,如圖:

():#定義類

def__init__

(self,x,y):

self.x=x

self.y=y

defcross

(p1,p2,p3):

#跨立實驗

x1=p2.x-p1.x

y1=p2.y-p1.y

x2=p3.x-p1.x

y2=p3.y-p1.y

return x1*y2-x2*y1

defisintersec

(p1,p2,p3,p4):

#判斷兩線段是否相交

#快速排斥,以l1、l2為對角線的矩形必相交,否則兩線段不相交

if(max(p1.x,p2.x)>=min(p3.x,p4.x) #矩形1最右端大於矩形2最左端

and max(p3.x,p4.x)>=min(p1.x,p2.x) #矩形2最右端大於矩形最左端

and max(p1.y,p2.y)>=min(p3.y,p4.y) #矩形1最高端大於矩形最低端

and max(p3.y,p4.y)>=min(p1.y,p2.y)): #矩形2最高端大於矩形最低端

#若通過快速排斥則進行跨立實驗

if(cross(p1,p2,p3)*cross(p1,p2,p4)<=0

and cross(p3,p4,p1)*cross(p3,p4,p2)<=0):

d=1else:

d=0else:

d=0return d

判斷兩條線段是否相交

如上圖,判斷線段ab和線段cd相交。分析 如果線段ab和線段cd相交,只能是圖中的兩種相交情況。可以用向量叉乘來判斷。如果 向量ab叉乘向量ac 向量ab叉乘向量ad 0 並且 向量cd叉乘向量ca 向量cd叉乘向量cb 0,那麼說明線段ab與線段cd相交。設a x1,y1 b x2,y2 c x3...

判斷兩條線段是否相交

題目 給定兩條線段,判斷這兩條線段是否相交,線段ab的表示形式是a x1,y1 b x2,y2 線段cd的表示形式為c x3,y3 d x4,y4 那麼我們如何判斷線段ab與線段cd是否相交。解析 在介紹如何解決線段相交問題之前,我們先介紹向量的叉積。如下圖所示 下面的圖 1 表示p1向量在p2向量...

判斷兩條線段是否相交

1.必備知識 向量積 矢積 與數量積 標積 的區別 名稱標積 內積 數量積 點積 矢積 外積 向量積 叉積 表示式 a,b和c粗體字,表示向量 a b a b cos a b c,其中 c a b sin c的方向遵守右手定則 幾何意義 向量a在向量b方向上的投影與向量b的模的乘積 c是垂直a b所...