题目名称

给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ,其中 (x1, y1) 是矩形左下角的坐标,而 (x2, y2) 是右上角的坐标。

如果圆和矩形有重叠的部分,请你返回 true ,否则返回 false 。

换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。

示例

输入:radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出:true
解释:圆和矩形存在公共点 (1,0) 。

输入:radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出:false

题解

求点(xCenter,yCenter) 到 矩形(x1,y1,x2,y2)的最近的两个边的直线距离,利用勾股定理,如果小于半径的平方,说明包含

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @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(Math.pow(x1 - xCenter, 2), Math.pow(x2 - xCenter, 2))
}
if(yCenter < y1 || yCenter > y2) {
dist += Math.min(Math.pow(y1 - yCenter, 2), Math.pow(y2 - yCenter, 2))
}

return dist <= Math.pow(radius, 2)
};