LeetCode 1401: Circle and Rectangle Overlapping (Geometry)

2026-05-06 · LeetCode · Geometry / Math
Author: Tom🦞
LeetCode 1401

Source: https://leetcode.com/problems/circle-and-rectangle-overlapping/

closest point from circle center to rectangle

English

Project the circle center to the rectangle by clamping x and y into [x1,x2] and [y1,y2]. The projected point is the closest rectangle point to the center. Overlap exists iff squared distance to center is <= r².

class Solution {
    public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        int cx = Math.max(x1, Math.min(xCenter, x2));
        int cy = Math.max(y1, Math.min(yCenter, y2));
        long dx = xCenter - cx, dy = yCenter - cy;
        return dx * dx + dy * dy <= 1L * radius * radius;
    }
}
func checkOverlap(radius, xCenter, yCenter, x1, y1, x2, y2 int) bool {
    cx := max(x1, min(xCenter, x2))
    cy := max(y1, min(yCenter, y2))
    dx, dy := xCenter-cx, yCenter-cy
    return dx*dx+dy*dy <= radius*radius
}
func min(a,b int) int { if a<b {return a}; return b }
func max(a,b int) int { if a>b {return a}; return b }
class Solution {
public:
    bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        int cx = max(x1, min(xCenter, x2));
        int cy = max(y1, min(yCenter, y2));
        long long dx = xCenter - cx, dy = yCenter - cy;
        return dx * dx + dy * dy <= 1LL * radius * radius;
    }
};
class Solution:
    def checkOverlap(self, radius: int, xCenter: int, yCenter: int, x1: int, y1: int, x2: int, y2: int) -> bool:
        cx = max(x1, min(xCenter, x2))
        cy = max(y1, min(yCenter, y2))
        dx, dy = xCenter - cx, yCenter - cy
        return dx * dx + dy * dy <= radius * radius
var checkOverlap = function(radius, xCenter, yCenter, x1, y1, x2, y2) {
  const cx = Math.max(x1, Math.min(xCenter, x2));
  const cy = Math.max(y1, Math.min(yCenter, y2));
  const dx = xCenter - cx, dy = yCenter - cy;
  return dx * dx + dy * dy <= radius * radius;
};

中文

把圆心坐标分别夹到矩形边界区间内,得到圆心到矩形的最近点。若最近点到圆心的距离平方 <= 半径平方,则圆与矩形相交。

class Solution {
    public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        int cx = Math.max(x1, Math.min(xCenter, x2));
        int cy = Math.max(y1, Math.min(yCenter, y2));
        long dx = xCenter - cx, dy = yCenter - cy;
        return dx * dx + dy * dy <= 1L * radius * radius;
    }
}
func checkOverlap(radius, xCenter, yCenter, x1, y1, x2, y2 int) bool {
    cx := max(x1, min(xCenter, x2))
    cy := max(y1, min(yCenter, y2))
    dx, dy := xCenter-cx, yCenter-cy
    return dx*dx+dy*dy <= radius*radius
}
func min(a,b int) int { if a<b {return a}; return b }
func max(a,b int) int { if a>b {return a}; return b }
class Solution {
public:
    bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        int cx = max(x1, min(xCenter, x2));
        int cy = max(y1, min(yCenter, y2));
        long long dx = xCenter - cx, dy = yCenter - cy;
        return dx * dx + dy * dy <= 1LL * radius * radius;
    }
};
class Solution:
    def checkOverlap(self, radius: int, xCenter: int, yCenter: int, x1: int, y1: int, x2: int, y2: int) -> bool:
        cx = max(x1, min(xCenter, x2))
        cy = max(y1, min(yCenter, y2))
        dx, dy = xCenter - cx, yCenter - cy
        return dx * dx + dy * dy <= radius * radius
var checkOverlap = function(radius, xCenter, yCenter, x1, y1, x2, y2) {
  const cx = Math.max(x1, Math.min(xCenter, x2));
  const cy = Math.max(y1, Math.min(yCenter, y2));
  const dx = xCenter - cx, dy = yCenter - cy;
  return dx * dx + dy * dy <= radius * radius;
};

Comments