圆和矩形是否有重叠

216 阅读1分钟

1401. 圆和矩形是否有重叠 - 力扣(LeetCode)

给你一个以 (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;
};