53
53
54
54
** 方法一:数学**
55
55
56
- 计算矩形离圆最近的点和圆心的距离是否小于等于半径即可。
56
+ 对于一个点 $(x, y)$,它到圆心 $(xCenter, yCenter)$ 的最短距离为 $\sqrt{(x - xCenter)^2 + (y - yCenter)^2}$,如果这个距离小于等于半径 $radius$,那么这个点就在圆内(包括边界)。
57
+
58
+ 而对于矩形内(包括边界)的点,它们的横坐标 $x$ 满足 $x_1 \leq x \leq x_2$,纵坐标 $y$ 满足 $y_1 \leq y \leq y_2$。要判断圆和矩形是否有重叠的部分,相当于在矩形内找到一个点 $(x, y)$,使得 $a = |x - xCenter|$ 和 $b = |y - yCenter|$ 都取到最小值,此时若 $a^2 + b^2 \leq radius^2$,则说明圆和矩形有重叠的部分。
59
+
60
+ 因此,问题转化为求 $x \in [ x_1, x_2] $ 时 $a = |x - xCenter|$ 的最小值,以及 $y \in [ y_1, y_2] $ 时 $b = |y - yCenter|$ 的最小值。
61
+
62
+ 对于 $x \in [ x_1, x_2] $:
63
+
64
+ - 如果 $x_1 \leq xCenter \leq x_2$,那么 $|x - xCenter|$ 的最小值为 $0$;
65
+ - 如果 $xCenter \lt x_1$,那么 $|x - xCenter|$ 的最小值为 $x_1 - xCenter$;
66
+ - 如果 $xCenter \gt x_2$,那么 $|x - xCenter|$ 的最小值为 $xCenter - x_2$。
67
+
68
+ 同理,我们可以求出 $y \in [ y_1, y_2] $ 时 $|y - yCenter|$ 的最小值。以上我们可以统一用函数 $f(i, j, k)$ 来处理。
69
+
70
+ 即 $a = f(x_1, x_2, xCenter)$, $b = f(y_1, y_2, yCenter)$,如果 $a^2 + b^2 \leq radius^2$,则说明圆和矩形有重叠的部分。
57
71
58
72
<!-- tabs:start -->
59
73
63
77
64
78
``` python
65
79
class Solution :
66
- def checkOverlap (
67
- self ,
68
- radius : int ,
69
- xCenter : int ,
70
- yCenter : int ,
71
- x1 : int ,
72
- y1 : int ,
73
- x2 : int ,
74
- y2 : int ,
75
- ) -> bool :
76
- dx = dy = 0
77
- if x1 > xCenter:
78
- dx = xCenter - x1
79
- elif x2 < xCenter:
80
- dx = xCenter - x2
81
- if y1 > yCenter:
82
- dy = yCenter - y1
83
- elif y2 < yCenter:
84
- dy = yCenter - y2
85
- return dx * dx + dy * dy <= radius * radius
80
+ def checkOverlap (self , radius : int , xCenter : int , yCenter : int , x1 : int , y1 : int , x2 : int , y2 : int ) -> bool :
81
+ def f (i : int , j : int , k : int ) -> int :
82
+ if i <= k <= j:
83
+ return 0
84
+ return i - k if k < i else k - j
85
+
86
+ a = f(x1, x2, xCenter)
87
+ b = f(y1, y2, yCenter)
88
+ return a * a + b * b <= radius * radius
86
89
```
87
90
88
91
### ** Java**
@@ -91,11 +94,17 @@ class Solution:
91
94
92
95
``` java
93
96
class Solution {
94
- public boolean checkOverlap (
95
- int radius , int xCenter , int yCenter , int x1 , int y1 , int x2 , int y2 ) {
96
- int dx = x1 > xCenter ? x1 - xCenter : (x2 < xCenter ? xCenter - x2 : 0 );
97
- int dy = y1 > yCenter ? y1 - yCenter : (y2 < yCenter ? yCenter - y2 : 0 );
98
- return dx * dx + dy * dy <= radius * radius;
97
+ public boolean checkOverlap (int radius , int xCenter , int yCenter , int x1 , int y1 , int x2 , int y2 ) {
98
+ int a = f(x1, x2, xCenter);
99
+ int b = f(y1, y2, yCenter);
100
+ return a * a + b * b <= radius * radius;
101
+ }
102
+
103
+ private int f (int i , int j , int k ) {
104
+ if (i <= k && k <= j) {
105
+ return 0 ;
106
+ }
107
+ return k < i ? i - k : k - j;
99
108
}
100
109
}
101
110
```
@@ -106,9 +115,15 @@ class Solution {
106
115
class Solution {
107
116
public:
108
117
bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
109
- int dx = x1 > xCenter ? x1 - xCenter : (x2 < xCenter ? xCenter - x2 : 0);
110
- int dy = y1 > yCenter ? y1 - yCenter : (y2 < yCenter ? yCenter - y2 : 0);
111
- return dx * dx + dy * dy <= radius * radius;
118
+ auto f = [ ] (int i, int j, int k) -> int {
119
+ if (i <= k && k <= j) {
120
+ return 0;
121
+ }
122
+ return k < i ? i - k : k - j;
123
+ };
124
+ int a = f(x1, x2, xCenter);
125
+ int b = f(y1, y2, yCenter);
126
+ return a * a + b * b <= radius * radius;
112
127
}
113
128
};
114
129
```
@@ -117,18 +132,42 @@ public:
117
132
118
133
```go
119
134
func checkOverlap(radius int, xCenter int, yCenter int, x1 int, y1 int, x2 int, y2 int) bool {
120
- dx, dy := 0, 0
121
- if x1 > xCenter {
122
- dx = x1 - xCenter
123
- } else if x2 < xCenter {
124
- dx = x2 - xCenter
125
- }
126
- if y1 > yCenter {
127
- dy = y1 - yCenter
128
- } else if y2 < yCenter {
129
- dy = y2 - yCenter
135
+ f := func(i, j, k int) int {
136
+ if i <= k && k <= j {
137
+ return 0
138
+ }
139
+ if k < i {
140
+ return i - k
141
+ }
142
+ return k - j
130
143
}
131
- return dx*dx+dy*dy <= radius*radius
144
+ a := f(x1, x2, xCenter)
145
+ b := f(y1, y2, yCenter)
146
+ return a*a+b*b <= radius*radius
147
+ }
148
+ ```
149
+
150
+ ### ** TypeScript**
151
+
152
+ ``` ts
153
+ function checkOverlap(
154
+ radius : number ,
155
+ xCenter : number ,
156
+ yCenter : number ,
157
+ x1 : number ,
158
+ y1 : number ,
159
+ x2 : number ,
160
+ y2 : number ,
161
+ ): boolean {
162
+ const f = (i : number , j : number , k : number ) => {
163
+ if (i <= k && k <= j ) {
164
+ return 0 ;
165
+ }
166
+ return k < i ? i - k : k - j ;
167
+ };
168
+ const a = f (x1 , x2 , xCenter );
169
+ const b = f (y1 , y2 , yCenter );
170
+ return a * a + b * b <= radius * radius ;
132
171
}
133
172
```
134
173
0 commit comments