89 lines
3.0 KiB
Python
89 lines
3.0 KiB
Python
def on_boundary(point, loop): # dk if this even needed but fucked if im removing it
|
|
x, y = point
|
|
for i in range(len(loop)):
|
|
x1, y1 = loop[i]
|
|
x2, y2 = loop[(i + 1) % len(loop)]
|
|
|
|
if (x1 == x2 == x) and (min(y1, y2) <= y <= max(y1, y2)):
|
|
return True
|
|
if (y1 == y2 == y) and (min(x1, x2) <= x <= max(x1, x2)):
|
|
return True
|
|
return False
|
|
|
|
def point_in_loop(point, loop): # ray-casting algorithm - deternines if point is in loop
|
|
x, y = point
|
|
inside = False
|
|
n = len(loop)
|
|
for i in range(n):
|
|
xi, yi = loop[i]
|
|
xj, yj = loop[(i + 1) % n]
|
|
if (yi > y) != (yj > y):
|
|
xints = xi + (y - yi) * (xj - xi) / (yj - yi)
|
|
if x <= xints:
|
|
inside = not inside
|
|
return inside
|
|
|
|
def rect_in_loop(v1, v2, loop_vertices):
|
|
rx_min, rx_max = min(v1[0], v2[0]), max(v1[0], v2[0])
|
|
ry_min, ry_max = min(v1[1], v2[1]), max(v1[1], v2[1])
|
|
|
|
if rx_min == rx_max or ry_min == ry_max: # single line cases!
|
|
mid_x = (rx_min + rx_max) / 2
|
|
mid_y = (ry_min + ry_max) / 2
|
|
return point_in_loop((mid_x, mid_y), loop_vertices)
|
|
|
|
# rule 1: is center in loop?
|
|
center_point = ((rx_min + rx_max) / 2, (ry_min + ry_max) / 2)
|
|
|
|
if not point_in_loop(center_point, loop_vertices):
|
|
return False
|
|
|
|
# rule 2: are any vertices of the loop inside the rectangle?, if so you done fucked up a-aron
|
|
for (vx, vy) in loop_vertices:
|
|
if rx_min < vx < rx_max and ry_min < vy < ry_max:
|
|
return False
|
|
|
|
# rule 3: any edge of the loop cross the rectangle fully?
|
|
# ACCORDING TO MY CALCULATIONS THIS SHOULD NOT BE NEEDED YET IT DOES NOT WORK WITHOUT IT SO HERE WE ARE
|
|
n = len(loop_vertices)
|
|
for i in range(n):
|
|
p1 = loop_vertices[i]
|
|
p2 = loop_vertices[(i + 1) % n]
|
|
|
|
# verical edges
|
|
if p1[0] == p2[0]:
|
|
edge_x = p1[0]
|
|
y_start, y_end = min(p1[1], p2[1]), max(p1[1], p2[1])
|
|
|
|
if rx_min < edge_x < rx_max:
|
|
if y_start <= ry_min and y_end >= ry_max:
|
|
return False
|
|
|
|
# horizontal edges
|
|
elif p1[1] == p2[1]:
|
|
edge_y = p1[1]
|
|
x_start, x_end = min(p1[0], p2[0]), max(p1[0], p2[0])
|
|
|
|
if ry_min < edge_y < ry_max:
|
|
if x_start <= rx_min and x_end >= rx_max:
|
|
return False
|
|
|
|
return True
|
|
|
|
valid_rects = []
|
|
|
|
with open('input.txt', 'r') as file:
|
|
lines = file.readlines()
|
|
coords = [tuple(map(int, line.strip().split(','))) for line in lines]
|
|
|
|
for i in range(len(coords)):
|
|
for j in range(i + 1, len(coords)):
|
|
v1 = coords[i]
|
|
v2 = coords[j]
|
|
|
|
if v1[0] != v2[0] and v1[1] != v2[1]:
|
|
if rect_in_loop(v1, v2, coords):
|
|
valid_rects.append((v1, v2, (abs(v2[0] - v1[0]) + 1) * (abs(v2[1] - v1[1]) + 1)))
|
|
|
|
print("Largest area rectangle:", max(valid_rects, key=lambda x: x[2]) if valid_rects else None) # pls santa pls pls pls i swear i will never say anything bad abt your elves again
|