我們在初等幾何中學過如何判斷兩條直線是否相交。在歐幾里得平面上,兩條直線要麼平行,要麼相交,要麼重合。這是歐幾里得第五公設的推論。相交的兩條直線恰好有乙個交點,而重合的兩條直線有無數個交點。判斷兩條直線位置關係的代數方法是:聯立兩條之直線方程,無解,則兩條直線平行,存在唯一解則兩條直線相交,存在兩個及以上的解,則兩直線重合。c1
=a1x
+b1c
2=a2
x+b2
c 1=
a1x+
b1c2
=a2x
+b2分為矩形判定和叉積判定兩步
判斷分別以兩線段為對角線的兩個矩形是否相交,若不相交,則兩線段一定不相交。兩個矩形是否相交的條件是:任一矩形的最右端都大於另一矩形的最左端,且任一矩形最高端大於另一矩形的最低端;只要其中任一條件不滿足,則兩矩形不相交,也即兩線段不相交。
這一步判定不相交的兩條線段直接返回false
。
經過上面判定未得到結果的兩條線段那進入此步進行判定。
這一步的目的是確定一條線段的兩個端點是否在另一線段的兩側,如果兩條線段的端點互相位於另一條線段的兩側,則這兩條線段相交。
def
cross
(p1,p2,p3):
# 叉積判定
x1=p2[0]-p1[0]
y1=p2[1]-p1[1]
x2=p3[0]-p1[0]
y2=p3[1]-p1[1]
return x1*y2-x2*y1
defsegment
(p1,p2,p3,p4):
#判斷兩線段是否相交
#矩形判定,以l1、l2為對角線的矩形必相交,否則兩線段不相交
if(max(p1[0],p2[0])>=min(p3[0],p4[0]) #矩形1最右端大於矩形2最左端
and max(p3[0],p4[0])>=min(p1[0],p2[0]) #矩形2最右端大於矩形1最左端
and max(p1[1],p2[1])>=min(p3[1],p4[1]) #矩形1最高端大於矩形2最低端
and max(p3[1],p4[1])>=min(p1[1],p2[1])): #矩形2最高端大於矩形1最低端
if(cross(p1,p2,p3)*self.cross(p1,p2,p4)<=0
and cross(p3,p4,p1)*self.cross(p3,p4,p2)<=0):
d=1else:
d=0else:
d=0return d
矩形的特殊之處在於其有2
條對角線,小於其邊數4
。對於凸多邊形,只要一條線段穿越矩形必定與某一條對角線相交。因此我們將線段與矩形相交問題轉化為線段與矩形對角線的交點問題,為了排除特殊情況,在檢測線段與對角線交點前,我們檢測線段的兩個端點是否在矩形內。
def check(l1,l2,sq):
# step 1 check if end point is in the square
if ( l1[0] >= s
q[0]
and l1[1] >= s
q[1]
and l1[0] <= s
q[2]
and l1[1] <= s
q[3]) or
( l2[0] >= s1[0] and l2[1] >= s1[1] and l2[0] <= s
q[2]
and l2[1] <= s
q[3]):
return
1else:
# step 2 check if diagonal cross the segment
p1 = [s
q[0],s
q[1]]
p2 = [s
q[2],s
q[3]]
p3 = [s
q[2],s
q[1]]
p4 = [s
q[0],s
q[3]]
if segment(l1,l2,p1,p2) or segment(l1,l2,p3,p4):
return
1else:
return
0
其中sq
=[xl
eftd
own,
ylef
tdow
n,xr
ight
up,y
righ
tup]
s q=
[xle
ftdo
wn,y
left
down
,xri
ghtu
p,yr
ight
up],代表矩形左下角和右上角的座標。
C 判斷線段是否相交
c 判斷線段是否相交 線段是否相交,一種是從幾何上就是判斷兩個線段有沒有交點,還有一種是通過向量叉乘 也就是向量積 來判斷。因為向量叉乘的結果是乙個垂直於原來兩個向量的新向量,可以簡單的理解為垂直於原來兩向量所在平面的向量。我們來看圖。線段是否相交 線段p1p2的p1點 線段p1p2的p2點 線段q...
C 判斷線段是否相交
線段是否相交,一種是從幾何上就是判斷兩個線段有沒有交點,還有一種是通過向量叉乘 也就是向量積 來判斷。因為向量叉乘的結果是乙個垂直於原來兩個向量的新向量,可以簡單的理解為垂直於原來兩向量所在平面的向量。我們來看圖 線段是否相交 線段p1p2的p1點 線段p1p2的p2點 線段q1q2的q1點 線段q...
判斷線段是否與圓相交模板
判斷線段和圓是否相交 判斷圓和線段相交,分兩種情況 1.如圖a所示,當圓心與線段的距離大於圓的半徑時,線段與圓肯定不相交 推導過程 此處補充直線方程的五種形式 一般式為ax by c 0,它的優點就是它可以表示平面上的任意一條直線,僅此而已.斜截式y kx b,就不能表示垂直x軸的直線x a.點斜式...