题目地址:https://leetcode-cn.com/problems/circle-and-rectangle-overlapping/
题目描述
给你一个以 (radius, x_center, y_center)
表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2)
,其中 (x1, y1)
是矩形左下角的坐标,(x2, y2)
是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 True
,否则返回 False
。
换句话说,请你检测是否 存在 点 (xi, yi)
,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。
示例1:
输入:radius = 1, x_center = 0, y_center = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1 输出:true 解释:圆和矩形有公共点 (1,0)
示例2:
输入:radius = 1, x_center = 0, y_center = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
输出:true
示例3:
输入:radius = 1, x_center = 1, y_center = 1, x1 = -3, y1 = -3, x2 = 3, y2 = 3
输出:true
示例4:
输入:radius = 1, x_center = 1, y_center = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出:false
提示:
1、 1<=radius<=2000
;
2、 -10^4<=x_center,y_center,x1,y1,x2,y2<=10^4
;
3、 x1<x2
;
4、 y1<y2
;
题目大意
要判断一个圆和另一个矩形是否有交点。
解题方法
利用公式
求矩形和圆是否相交的方法看:“怎样判断平面上一个矩形和一个圆形是否有重叠? - Milo Yip的回答 - 知乎 https://www.zhihu.com/question/24251545/answer/27184960”。
总结一下:
1、 首先把矩形中心移动到坐标原点;
2、 把圆形移动到第一象限;
3、 求矩形和圆形的最短距离(可能是矩形的一个边,也可能是顶点);
4、 比较该最短距离和圆的半径;
C++代码如下。
class Solution {
public:
bool checkOverlap(int radius, int x_center, int y_center, int x1, int y1, int x2, int y2) {
float rec_x_center = (x1 + x2) / 2;
float rec_y_center = (y1 + y2) / 2;
vector<float> v = {fabs(x_center - rec_x_center), fabs(y_center - rec_y_center)};
vector<float> h = {x2 - rec_x_center, y2 - rec_y_center};
vector<float> u = {max(v[0] - h[0], 0.0f), max(v[1] - h[1], 0.0f)};
return u[0] * u[0] + u[1] * u[1] <= radius * radius;
}
};
1 2 3 4 5 6 7 8 9 10 11
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发