python求两个矩形重叠区域(python矩形碰撞算法基础)

注意以下的坐标系屏幕中心点为原点,而非左上角为原点,所以代码和其它地方的不一样,请看清楚哦。

def rect_overlap(rect1,rect2):
    """
        rect1:矩形1,四元组,左上角坐标和右下角坐标
        rect2:矩形2,四元组,左上角坐标和右下角坐标
        本函数返回矩形相交区域的矩形及面积
    """
    (x11,y11,x12,y12) = rect1     # 矩形1左上角(x11,y11)和右下角(x12,y12) 
    (x21,y21,x22,y22) = rect2     # 矩形2左上角(x21,y21)和右下角(x22,y22)
    
    # 下面求最小的外包矩形
    startx = min(x11,x21)         # 外包矩形在x轴上左边界
    endx = max(x12,x22)           # 外包矩形在x轴上右边界
    starty = min(y12,y22)         # 外包矩形在y轴上上边界
    endy = max(y11,y21)           # 外包矩形在y轴上下边界
    # 想像一下两个矩形隔得比较远,那么外包矩形的宽度是不是肯定大于两个矩形的宽度和呢?
    # 所以,两个矩形相交,它们的宽度和必然大于最小外包矩形的宽度,它们的高度和也是必然大于外包矩形的高度
    width = (x12-x11) + (x22-x21) - (endx-startx)      # (endx-startx)表示外包矩形的宽度
    height = (y11-y12) + (y21-y22) - (endy-starty)     # (endy-starty)表示外包矩形的高度
    #height = -height
    #print(width,height)
    if width<=0 or height<=0:    # 不相交
        return tuple()
    else:                        # 相交
        X1 = max(x11,x21)        # 有相交则相交区域位置
        Y1 = min(y11,y21)
        X2 = min(x12,x22)
        Y2 = max(y12,y22)
    
    area = width * height        # 相交区域面积
    return (X1,Y1,X2,Y2,area)

关于李兴球

李兴球的博客是Python创意编程原创博客
此条目发表在python分类目录。将固定链接加入收藏夹。