【面】判断圆和矩形是否相交

给定一个以(radius,x_center,y_center)表示的圆和一个与坐标轴平行的矩形(x1,y1,x2,y2),其中(x1,y1)是矩形左下角的坐标,(x2,y2)是右上角的坐标。如果圆和矩形有重叠的部分,返回True ,否则返回False。

将矩形分为9个区域,判定圆心的位置在哪个区域:

  • 如果圆心在矩形的内部,则一定相交;
  • 如果圆心位于矩形的上下左右四个区域当中,检测圆心到边的距离,判定是否相交;
  • 如果圆心位于四个角对应的区域,只要检测矩形的四个顶点是否在圆的内部即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
def checkOverlap(self, radius, x_center, y_center, x1, y1, x2, y2):
# 条件 1:首先判断圆心是否在矩形内
if x1 <= x_center <= x2 and y1 <= y_center <= y2:
return True
# 条件 2:圆心位于矩形的上下左右四个区域
elif x_center > x2 and y1 <= y_center <= y2: # 右
return radius >= x_center - x2
elif y_center < y1 and x1 <= x_center <= x2: # 下
return radius >= y1 - y_center
elif x_center < x1 and y1<= y_center <= y2: # 左
return radius >= x1 - x_center
elif y_center > y2 and x1 <= x_center <= x2: # 上
return radius >= y_center - y2
# 条件 3:判断矩形的四个顶点是否在圆的内部
else:
return min((x1 - x_center) ** 2 + (y2 - y_center) ** 2,\
(x2 - x_center) ** 2 + (y2 - y_center) ** 2, \
(x2 - x_center) ** 2 + (y1 - y_center) ** 2, \
(x1 - x_center) ** 2 + (y1 - y_center) ** 2) <= radius ** 2

if __name__=='__main__':
s = Solution()
print(s.checkOverlap(1, 0, 0, 1, -1, 3, 1))
0%