LeetCode 1401: Circle and Rectangle Overlapping (Geometry)
LeetCode 1401Source: https://leetcode.com/problems/circle-and-rectangle-overlapping/
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 * radiusvar 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 * radiusvar 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