【算法】Circle and Rectangle Overlapping 圆和矩形是否有重叠

该文章讨论了一个编程问题,即如何判断给定的圆和矩形在二维坐标系中是否有重叠。通过分析圆心与矩形边界的距离,可以确定二者是否相交。文章提供了一种O(1)时间复杂度和空间复杂度的解决方案,该方案首先检查圆心是否在矩形内,然后计算圆心到矩形边界的最短距离平方,如果小于等于圆的半径平方,则说明存在重叠。
摘要由CSDN通过智能技术生成

Circle and Rectangle Overlapping 圆和矩形是否有重叠

问题描述:

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

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

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

**radius 范围[1,2000] **

xCenter, yCenter范围[ − 1 0 4 -10^4 104, 1 0 4 10^4 104]

x 1 x_1 x1, y 1 y_1 y1范围[ − 1 0 4 -10^4 104, 1 0 4 10^4 104]

x 2 x_2 x2, y 2 y_2 y2范围[ − 1 0 4 -10^4 104, 1 0 4 10^4 104]

分析

如果要确定是否有重叠,就需要在矩形上找到一个点,并且与圆心的距离<=radius.
一种方式就是枚举矩形边上的点,包括顶点。因为条件中给出的坐标都是int,所以不存在小数。因此可以枚举每一个边上的坐标点,一条边的范围是[1, 2 ∗ 1 0 4 2*10^4 2104],如果对4个边都计算一遍,理论上也是可以的。
但是如果条件中给出的坐标是 d o u b l e double double,这种暴力枚举的方式,就无法处理。因为每2个整数之间的小数太多,无法进行枚举。
而在此方法中,也不需要枚举所有的边,可以判断圆和矩形的相对位置,来决定用哪一条边来验证。

换一个角度思考,还是基于假设圆心坐标O( x , y x,y x,y),而矩形的左下角( x l , y l xl,yl xl,yl),右上角( x r , y r xr,yr xr,yr),那么如果坐标点p( p x , p y px,py px,py)在矩形中,必然满足px属于 [ x l , x r ] [xl,xr] [xl,xr]&&py属于 [ y l , y r ] [yl,yr] [yl,yr].
而p与圆心O的距离为 d i s 2 = [ a b s ( p x − x ) ] 2 + [ a b s ( p y − y ) ] 2 dis^2 = [abs(px-x)]^2+[abs(py-y)]^2 dis2=[abs(pxx)]2+[abs(pyy)]2.如果 d i s t 2 < = r a d i u s 2 dist^2<=radius^2 dist2<=radius2,可以存在,就说明2者必然重合。
所以问题就变成数值q在区间 [ L , R ] [L,R] [L,R]中找到一个 a b s ( q − X ) abs(q-X) abs(qX)的最小值。

代码

public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        double dist = 0;
        if (xCenter < x1 || xCenter > x2) {
            dist += Math.min(Math.pow(x1 - xCenter, 2), Math.pow(x2 - xCenter, 2));
        }
        if (yCenter < y1 || yCenter > y2) {
            dist += Math.min(Math.pow(y1 - yCenter, 2), Math.pow(y2 - yCenter, 2));
        }
        return dist <= radius * radius;
    }

时间复杂度 O ( 1 ) O(1) O(1)

空间复杂度 O ( 1 ) O(1) O(1)

Tag

Math
Geometry

判断一个半矩形是否重叠部分,可以通过以下步骤进行: 1. 确定半矩形的位置关系,即判断是否矩形内部或边界上。 2. 如果半心在矩形内部,则一定有重叠部分。 3. 如果半心在矩形边界上,则需要进一步判断的直径是否矩形相交。 4. 如果半的直径与矩形相交,则一定有重叠部分。 下面是一个判断矩形是否重叠部分的 C# 代码示例: ```csharp public bool IsOverlap(Rectangle rect, Point center, int radius) { // 判断是否矩形内部或边界上 if (center.X < rect.Left || center.X > rect.Right || center.Y < rect.Top || center.Y > rect.Bottom) { // 半心不在矩形内部或边界上,一定没有重叠部分 return false; } // 判断的直径是否矩形相交 int diameter = radius * 2; int left = Math.Max(rect.Left, center.X - radius); int right = Math.Min(rect.Right, center.X + radius); int top = Math.Max(rect.Top, center.Y - radius); int bottom = Math.Min(rect.Bottom, center.Y + radius); int dx = center.X - left; int dy = center.Y - top; if (dx * dx + dy * dy <= radius * radius) { // 半的左端点在矩形内部或边界上 return true; } dx = center.X - right; dy = center.Y - top; if (dx * dx + dy * dy <= radius * radius) { // 半的右端点在矩形内部或边界上 return true; } dx = center.X - left; dy = center.Y - bottom; if (dx * dx + dy * dy <= radius * radius) { // 半的下端点在矩形内部或边界上 return true; } dx = center.X - right; dy = center.Y - bottom; if (dx * dx + dy * dy <= radius * radius) { // 半的上端点在矩形内部或边界上 return true; } return false; } ``` 其中,`Rectangle` 表示矩形,`Point` 表示半心,`radius` 表示半径。函数返回布尔值,表示半矩形是否重叠部分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eric.Cui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值