Это отличный вопрос!
Ваш прямоугольник можно представить как 4 строки:
(x, y) → (x+width, y) # top
(x+width, y) → (x+width, y+height) # right
(x, y+height) → (x+width, y+height) # bottom
(x, y) → (x, y+height) # left
Взяв вашу пересекающуюся линию, можно использовать формулу для пересекающихся двух линий *1007*, чтобы определить, пересекается ли какая-либо из этих линий (но будьте осторожны с параллельными линиями!)
Однако формула (указанная в связанной статье в Википедии) определяет, пересекаются ли линии где-либо на 2D-плоскости, поэтому ее необходимо дополнительно уточнить. Очевидно, что код может быстро отбрасывать любые пересечения, которые происходят за пределами размеров окна.
Как только точка столкновения "бесконечной плоскости" была определена (что является достаточно быстрым определением), тогда можно определить более мелкозернистое пересечение. Используя алгоритм Брезенхэма , перечислите все точки пересекающейся линии и сравните их с 1-пиксельным прямоугольником, основанным на каждой стороне вашего квадрата. Это скажет вам, какая сторона прямоугольника пересеклась.
Если вам нужно только узнать, был ли выбран прямоугольник, просто проверьте весь прямоугольник с помощью pygame.Rect.collidepoint()
для каждой точки в линии.
![enter image description here](https://i.stack.imgur.com/47K0D.gif)
Конечно, после того, как вы сгенерировали все эти точки, легко не беспокоиться о столкновении 2D-линий, но для длинных линий код должен выполнять много проверок. Поэтому тестирование 2D-пересечения сначала действительно ускоряет его.