【每日一题】1401. 圆和矩形是否有重叠
- 1401. 圆和矩形是否有重叠
- 题目描述
- 解题思路
1401. 圆和矩形是否有重叠
题目描述
给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ,其中 (x1, y1) 是矩形左下角的坐标,而 (x2, y2) 是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 true ,否则返回 false 。
换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。
示例 1 :
输入:radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出:true
解释:圆和矩形存在公共点 (1,0) 。
示例 2 :
输入:radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出:false
示例 3 :
输入:radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
输出:true
提示:
1 <= radius <= 2000
-104 <= xCenter, yCenter <= 104
-104 <= x1 < x2 <= 104
-104 <= y1 < y2 <= 104
解题思路
思路:将圆和矩形是否有重叠的问题,转换成圆心是否在对应区域的问题,从而简化问题。其中圆心所在区域是一个矩形向外扩展圆形半径的圆角矩形,可以将其分为三部分计算,第一部分是矩形,第二部分是以矩形为边界长度为圆形半径的四个矩形,第三部分是以矩形四个顶点为边界长度为圆形半径的四个扇形。矩形即直接判断圆心位置与矩形横纵坐标边界的关系;扇形即直接判断圆心位置与矩形四个角的距离与圆形半径的关系。
//判断圆心是否在以矩形为边界长度为圆形半径的四个矩形
bool isInRectangle(int xCenter,int yCenter,int x1,int x2,int y1,int y2)
{
if(xCenter>=x1&&xCenter<=x2&&yCenter>=y1&&yCenter<=y2)
return true;
return false;
}
//判断圆心是否在以矩形四个顶点为边界长度为圆形半径的四个扇形
bool isInCircle(int xCenter,int yCenter,int x1,int y1,int radius)
{
if((xCenter-x1)*(xCenter-x1)+(yCenter-y1)*(yCenter-y1)<=radius*radius)
return true;
return false;
}
bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2)
{
//判断圆心是否在矩形体内
if(isInRectangle(xCenter,yCenter,x1,x2,y1,y2))
return true;
//判断圆心是否在矩形体四周矩形
if(isInRectangle(xCenter,yCenter,x1-radius,x1,y1,y2))
return true;
if(isInRectangle(xCenter,yCenter,x2,x2+radius,y1,y2))
return true;
if(isInRectangle(xCenter,yCenter,x1,x2,y1-radius,y1))
return true;
if(isInRectangle(xCenter,yCenter,x1,x2,y2,y2+radius))
return true;
//判断圆心是否在矩形体四周扇形
if(isInCircle(xCenter,yCenter,x1,y1,radius))
return true;
if(isInCircle(xCenter,yCenter,x1,y2,radius))
return true;
if(isInCircle(xCenter,yCenter,x2,y1,radius))
return true;
if(isInCircle(xCenter,yCenter,x2,y2,radius))
return true;
//以上均不满足则返回false
return false;
}
总结:圆角矩形就很巧妙!