- 作者: 負雪明燭
- id: fuxuemingzhu
- 個人博客:http://fuxuemingzhu.cn/
題目地址: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 <= radius <= 2000
-10^4 <= x_center, y_center, x1, y1, x2, y2 <= 10^4
x1 < x2
y1 < y2
題目大意
要判斷一個圓和另一個矩形是否有交點。
解題方法
利用公式
求矩形和圓是否相交的方法看:“怎樣判斷平面上一個矩形和一個圓形是否有重疊? - Milo Yip的回答 - 知乎
https://www.zhihu.com/question/24251545/answer/27184960”。
總結一下:
- 首先把矩形中心移動到座標原點
- 把圓形移動到第一象限
- 求矩形和圓形的最短距離(可能是矩形的一個邊,也可能是頂點)
- 比較該最短距離和圓的半徑
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;
}
};
歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!
日期
2020 年 4 月 5 日 —— 好久不打周賽了