【LeetCode】1401. 圓和矩形是否有重疊 Circle and Rectangle Overlapping


題目地址: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;
    }
};

歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!

日期

2020 年 4 月 5 日 —— 好久不打周賽了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章