给你一个以 (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
提示:
1 <= radius <= 2000
-104 <= x_center, y_center, x1, y1, x2, y2 <= 104
x1 < x2
y1 < y2
自我解答
唉,虽然知道这题是 “矩形重叠”的升级版,但看了提示,也没想出来。
提示内容是:找出矩形中,离圆心最近的点,若两点距离小于圆半径,则说明有重叠。
很简单呢。。。可是我硬生生没找出最近的点。
我是拿矩形 4 个顶点算距离的,但最近的点,并不一定在这 4 个点中
题解
最近的点,可以判断出来,假如最近点为 (x, y),
则 如果 x_center >= x2, 则 x = x2
同理, .....
还是抽象思维能力不够强
class Solution:
def checkOverlap(self, radius: int, x_center: int, y_center: int, x1: int, y1: int, x2: int, y2: int) -> bool:
if x_center >= x2:
x = x2
elif x_center <= x1:
x = x1
else:
x = x_center
if y_center >= y2:
y = y2
elif y_center <= y1:
y = y1
else:
y = y_center
a, b = abs(x - x_center), abs(y - y_center)
return a * a + b * b <= radius * radius
原题链接:https://leetcode-cn.com/problems/circle-and-rectangle-overlapping