给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ,其中 (x1, y1) 是矩形左下角的坐标,而 (x2, y2) 是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 true ,否则返回 false 。
换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。
示例 1 :
输入: radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出: true
解释: 圆和矩形存在公共点 (1,0) 。
示例 2 :
输入: radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出: false
示例 3 :
输入: radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
输出: true
提示:
1 <= radius <= 2000-10^4 <= xCenter, yCenter <= 10^4-10^4 <= x1 < x2 <= 10^4-10^4 <= y1 < y2 <= 10^4
思路
我们知道求一个点是否在圆内,只需要计算点到圆心的距离,当距离大于半径时,点在圆外面,当距离小于等于半径时,点在圆内。本题我们可以等价为求矩形内距离圆最近的点,这个点到圆心的距离是否小于等于圆的半径。设这个点的坐标为[x, y], 距离为 distance = Math.sqrt(Math.pow(x - xCenter) + Math.pow(y - yCenter)),为使 distance 最小,|x - xCenter| 和 |y - yCenter| 都要取最小值
- 当
x1 <= xCenter <= x2时,|x - xCenter|的最小值为0 - 当
x1 > xCenter时,|x - xCenter|的最小值为x1 - xCenter - 当
x2 < xCenter时,|x - xCenter|的最小值为xCenter - x2 - 当
y1 <= yCenter <= y2时,|y - yCenter|的最小值为0 - 当
y1 > yCenter时,|y - yCenter|的最小值为y1 - yCenter - 当
y2 < yCenter时,|y - yCenter|的最小值为yCenter - y2
代码如下:
解题
/**
* @param {number} radius
* @param {number} xCenter
* @param {number} yCenter
* @param {number} x1
* @param {number} y1
* @param {number} x2
* @param {number} y2
* @return {boolean}
*/
var checkOverlap = function (radius, xCenter, yCenter, x1, y1, x2, y2) {
let dist = 0;
if (xCenter < x1 || xCenter > x2) {
dist = Math.min((x1 - xCenter) ** 2, (x2 - xCenter) ** 2);
}
if (yCenter < y1 || yCenter > y2) {
dist += Math.min((y1 - yCenter) ** 2, (y2 - yCenter) ** 2);
}
return dist <= radius ** 2;
};