2023-06-25每日一题
一、题目编号
1401. 圆和矩形是否有重叠
二、题目链接
点击跳转到题目位置
三、题目描述
给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ,其中 (x1, y1) 是矩形左下角的坐标,而 (x2, y2) 是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 true ,否则返回 false 。
换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。
提示:
- 1 <= radius <= 2000
- -104 <= xCenter, yCenter <= 104
- -104 <= x1 < x2 <= 104
- -104 <= y1 < y2 <= 104
四、解题代码
class Solution {long long distance(int xCenter, int yCenter, int x0, int y0){return (long long) pow(xCenter - x0, 2) + (long long) pow(yCenter - y0, 2);}public:bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {if (x1 <= xCenter && xCenter <= x2 && y1 <= yCenter && yCenter <= y2) {return true;}if (x1 <= xCenter && xCenter <= x2 && y2 <= yCenter && yCenter <= y2 + radius) {return true;}if (x1 <= xCenter && xCenter <= x2 && y1 - radius <= yCenter && yCenter <= y1) {return true;}if (x1 - radius <= xCenter && xCenter <= x1 && y1 <= yCenter && yCenter <= y2) {return true;}if (x2 <= xCenter && xCenter <= x2 + radius && y1 <= yCenter && yCenter <= y2) {return true;}if(distance(xCenter, yCenter, x1, y2) <= radius * radius){//左上角return true;}if(distance(xCenter, yCenter, x2, y2) <= radius * radius){//右上角return true;}if(distance(xCenter, yCenter, x2, y1) <= radius * radius){//右下角return true;}if(distance(xCenter, yCenter, x1, y1) <= radius * radius){//左下角return true;}return false;}
};
五、解题思路
(1) 总共需要讨论九种不同的情况。(将正方形的点与四个对角线点最近的时候的4种情况汇总来说明)
- 圆心在正方形内,满足条件
- 圆心在正方形上方,则圆下方边界要不高于正方形上边界
- 圆心在正方形下方,则圆上方边界要不低于正方形下边界
- 圆心在正方形左方,则圆右方边界要至少等于或超过正方形左边界
- 圆心在正方形右方,则圆左方边界要至少等于或超过正方形有边界
- 圆心距离正方形四个顶点很近,那么圆心到顶点的距离应该小于等于半径。
(2) 最后上述条件均不满足,返回false即可。