前言:锻炼自己的思想,规范自己的编程思路。
问题:
给你一个以 (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) 。
思路:
函数名为checkOverlap,它接受了7个参数:radius,xCenter,yCenter,x1,y1,x2 和 y2。该函数返回一个布尔值。
该函数计算一个给定半径为 radius 的圆(圆心为 xCenter, yCenter)与一个由其左下角(x1, y1)和右上角(x2, y2)定义的矩形之间的距离。距离沿 x 轴(dx)和 y 轴(dy)分别计算。
如果圆心在矩形的左侧,则 dx 为 x1 和 xCenter 之间的距离。
如果圆心在矩形的右侧,则 dx 为 x2 和 xCenter 之间的距离。
如果圆心在矩形的水平边界内,则 dx 为0。同样的逻辑适用于计算 dy。
然后该函数返回这些距离的平方和(dx * dx + dy * dy)是否小于等于圆半径的平方(radius * radius)。如果是,则意味着圆和矩形重叠,因此函数返回 true。否则,它返回 false。
总之,这个函数检查给定的圆和矩形是否重叠,并在它们重叠时返回 true,否则返回 false。
基于上述思考,代码如下:
/**
* @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) {
const dx = x1 > xCenter ? (x1-xCenter) : (x2 < xCenter ? xCenter-x2 : 0);
const dy = y1 > yCenter ? (y1-yCenter) : (y2 < yCenter ? yCenter-y2 : 0);
return dx * dx + dy * dy <= radius * radius;
};
执行结果如下图: