判断平面上任意两条线段是否相交-Python实现

判断两线段是否相交:

步骤一:快速排斥
即判断以两线段为对角线的矩形是否相交,若不相交,则两线段一定不相交

而判断两个矩形是否相交,只要任一矩形的最右端都大于另一矩形的最左端且任一矩形最高端大于另一矩形的最低端,则两矩形相交;反之,若其中任一条件不满足,两矩形不相交。

步骤二:跨立实验
如果两线段相交,则两线段必须互相跨立对方,即其中任一线段的两端一定在另一线段的两侧
如下图所示:线段P1P2与线段P3P4相交,则P1和P2一定在线段P3P4的两侧,所以 (P3P1×P3P4)(P3P2×P3P4)<0
判断平面上任意两条线段是否相交-Python实现_第1张图片

若出现 (P3P1×P3P4)=0 ,则 P3P1 P3P4 共线,但因为已通过跨立实验,所以 P1 一定在线段 P3P4 上。
所以判断线段P1P2跨立线段P3P4的条件是 (P3P1×P3P4)(P3P2×P3P4)0
同理可得,线段P3P4跨立线段P1P2的条件是 (P2P3×P2P1)(P2P4×P2P1)0

因此,判断两线段相交,需要同时满足快速排斥和跨立实验,如图:
判断平面上任意两条线段是否相交-Python实现_第2张图片

#Python3.6
class point(): #定义类
    def __init__(self,x,y):
        self.x=x
        self.y=y   

def cross(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     

def IsIntersec(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=1
        else:
            D=0
    else:
        D=0
    return D

参考博文:

http://www.cnblogs.com/g0feng/archive/2012/05/18/2508293.html

你可能感兴趣的:(Python-几何)