力扣刷题:圆和矩形是否有重叠

132 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。

问题:

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

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

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

示例:(放代码里面)

image-20230625223014943.png

输入: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;
};


执行结果如下图: image-20230625222934933.png