Python. Найти пересечение двух прямоугольников
На собеседовании получил задачку:
Есть два прямоугольника. У каждого известны координаты левый верх и правый низ. Нужно написать функцию, которая ответила бы на вопрос о том, пересекаются ли эти прямоугольники.
Задачку я решил с помощью массивов и собеседование давно закончилось, но подозреваю, что решение не достаточно хорошее:
def gen_rectangle(cords):
"""Генерирует массив координат всех занимаемых прямоугольником точек"""
rectangle = []
for i in range(cords[0][0], cords[1][0]):
for j in range(cords[0][1], cords[1][1]):
rectangle.append((i, j))
return rectangle
def intersection(cord1, cord2):
"""Есть ли пересечение"""
rectangle1 = gen_rectangle(cord1)
rectangle2 = gen_rectangle(cord2)
for i in rectangle1:
for j in rectangle2:
if i == j:
return 'We have intersection!'
return 'All good'
cord1 = ((1, 1), (4, 8)) # первый прямоугольник
cord2 = ((3, 3), (16, 20)) # второй прямоугольник
print(intersection(cord1, cord2))
Например: если прямоугольники будут ну очень большими, то каждая занимаемая одним прямоугольником точка - это два int, такое решение не оптимально расходует память. Как мое решение можно улучшить?
Ответы (1 шт):
Автор решения: вася
→ Ссылка
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def intersection(l_1, r_1, l_2, r_2):
if (l_1.x >= r_2.x or l_2.x >= r_1.x):
return False
if (l_1.y <= r_2.y or l_2.y <= r_1.y):
return False
return True
l_1 = Point(2, 2)
r_1 = Point(4, 1)
l_2 = Point(3, 2)
r_2 = Point(4, 0)
print(intersection(l_1, r_1, l_2, r_2))
Можно заменить нестрогие неравенства на строгие, в зависимости от условий.