1401.圆和矩形是否有重叠

该问题是一个编程挑战,涉及计算几何。给定一个圆和一个矩形的坐标,任务是判断它们是否有交集。方法是检查是否存在一个点,其到圆心的距离小于等于圆的半径,并位于矩形内。通过比较圆心与矩形边界的距离来实现这一判断。

题目描述:

给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ,其中 (x1, y1) 是矩形左下角的坐标,而 (x2, y2) 是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 true ,否则返回 false 。
换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。

示例:

来源:力扣(LeetCode)
来源:力扣(LeetCode)
来源:力扣(LeetCode)

解题思路:

存不存在一个x∈(x1,x2),y∈(y1,y2)的坐标与圆的坐标的距离小于圆的半径。
距离计算要求
存在点(x,y)使得(x-xCenter)²+(y-yCenter)²<=radius²
x∈(x1,x2)时,最小x-xCenter为
x1<=xCenter<=x2,x-xCenter=0
x1>xCenter,x=x1-xCenter
x2<xCenter,x=xCenter-x2
同理可得y-yCenter

代码附上:

class Solution {
    public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        return Math.pow(min(x1,xCenter,x2),2)+Math.pow(min(y1,yCenter,y2),2)<=Math.pow(radius,2);
    }
    public int min(int i,int j,int k) {
        if(i<=j&&j<=k) return 0;
        return i>j?i-j:j-k;
    }
}
判断一个半矩形是否重叠部分,可以通过以下步骤进行: 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值