给你一个以 (radius, x_center, y_center) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2),其中 (x1, y1) 是矩形左下角的坐标,(x2, y2) 是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 True ,否则返回 False 。
换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。
示例 1:
输入:radius = 1, x_center = 0, y_center = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出:true
解释:圆和矩形有公共点 (1,0)
示例 2:
输入:radius = 1, x_center = 0, y_center = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
输出:true
示例 3:
输入:radius = 1, x_center = 1, y_center = 1, x1 = -3, y1 = -3, x2 = 3, y2 = 3
输出:true
示例 4:
输入:radius = 1, x_center = 1, y_center = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出:false
提示:
- 1 <= radius <= 2000
- -10^4 <= x_center, y_center, x1, y1, x2, y2 <= 10^4
- x1 < x2
- y1 < y2
核心代码
class Solution:
def checkOverlap(self, radius: int, xCenter: int, yCenter: int, x1: int, y1: int, x2: int, y2: int) -> bool:
x,y = (x1 + x2) / 2,(y1 + y2) /2
h = [x2 - x, y2 - y]
v = [abs(x - xCenter),abs(y - yCenter)]
u = [max(v[0] - h[0],0),max(v[1] - h[1],0)]
return radius ** 2 >= (u[0] ** 2 + u[1] ** 2)
解题思路: 设c为矩形中心,h为矩形半長,p为圆心,r为半径。
方法是计算圆心与矩形的最短距离 u,若 u 的长度小于 r 则两者相交。
- 首先利用绝对值把 p - c 转移到第一象限,下图显示不同象限的圆心也能映射至
第一象限,这不影响相交测试的结果: