python 求两线段是否相交,如果相交求交点

代码如下,cal_point = False 不输出交点,cal_point = True 输出交点


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,cal_point = False):
    # 判断两线段是否相交
    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
    if D:
        if cal_point:
            # 不同K值线段,求交点
            tmpLeft_x = (p4.x - p3.x) * (p1.y - p2.y) - (p2.x - p1.x) * (p3.y - p4.y)
            tmpLeft_y = (p1.x - p2.x) * (p4.y - p3.y) - (p2.y - p1.y) * (p3.x - p4.x)
            tmpRight_x = (p1.y - p3.y) * (p2.x - p1.x) * (p4.x - p3.x) + p3.x * (p4.y - p3.y) * (p2.x - p1.x) - p1.x * (p2.y - p1.y) * (p4.x - p3.x)
            tmpRight_y = p2.y * (p1.x - p2.x) * (p4.y - p3.y) + (p4.x - p2.x) * (p4.y - p3.y) * (p1.y - p2.y) - p4.y * (p3.x - p4.x) * (p2.y - p1.y)
            if tmpLeft_x != 0 and tmpLeft_y != 0:
                x = tmpRight_x / tmpLeft_x
                y = tmpRight_y / tmpLeft_y
                return D,(x,y)
            else:
                return D,(None,None)
        return D
    else:
        if cal_point:
            return D,(None,None)
        return D

 

 

你可能感兴趣的:(几何运算,几何学,算法)