1401. Circle and Rectangle Overlapping | 1709
Merry Christmas!
1class Solution:
2 def checkOverlap(
3 self,
4 radius: int,
5 xCenter: int,
6 yCenter: int,
7 x1: int,
8 y1: int,
9 x2: int,
10 y2: int,
11 ) -> bool:
12 # intuition:
13 # start from circle center
14 # find dist to 4 edges (incl. extensions) of the rectangle
15 # true if (point not on extension) and (dist <= radius)
16 # also true if circle center within rectangle
17 # also true if 4 rectangle corners to circle center dist <= radius
18
19 square_left = x1
20 square_right = x2
21 square_bottom = y1
22 square_top = y2
23
24 circle_x = xCenter
25 circle_y = yCenter
26
27 def euclidean_distance(ex0, ey0, ex1, ey1) -> float:
28 return ((ex0 - ex1) ** 2 + (ey0 - ey1) ** 2) ** 0.5
29
30 # left
31 if abs(circle_x - square_left) <= radius and y1 <= circle_y <= y2:
32 return True
33 # right
34 if abs(circle_x - square_right) <= radius and y1 <= circle_y <= y2:
35 return True
36 # bottom
37 if abs(circle_y - square_bottom) <= radius and x1 <= circle_x <= x2:
38 return True
39 # top
40 if abs(circle_y - square_top) <= radius and x1 <= circle_x <= x2:
41 return True
42 # within
43 if x1 <= circle_x <= x2 and y1 <= circle_y <= y2:
44 return True
45
46 # bottom-left corner
47 if euclidean_distance(circle_x, circle_y, x1, y1) <= radius:
48 return True
49 # bottom-right corner
50 if euclidean_distance(circle_x, circle_y, x2, y1) <= radius:
51 return True
52 # top-left corner
53 if euclidean_distance(circle_x, circle_y, x1, y2) <= radius:
54 return True
55 # top-right corner
56 if euclidean_distance(circle_x, circle_y, x2, y2) <= radius:
57 return True
58
59 return False