Прямоугольник имеет 4 угловых точки. Если прямоугольник «меньше», чем окружность (диаметр окружности больше, чем диагональ прямоугольника), тогда прямоугольник сталкивается с контуром окружности, если хотя бы одна точка находится вне окружности и хотя быодна точка находится в круге.
Определите прямоугольник и настройте список угловых точек. Далее вы должны знать радиус круга:
w, h = 10, 30
rect = pygame.Rect(x, y, 10, 30)
corners = [rect.bottomleft, rect.bottomright, rect.topleft, rect.topright]
radius = 210
Рассчитать Евклидово расстояние каждой угловой точки до центра круга (a, b)
:
import math
dist = [math.sqrt((p[0]-a)**2 + (p[1]-b)**2) for p in corners]
Создание в списки, один с точками в круге (p_in
) и один с точками вне круга (p_out
):
p_out = [i for i, d in enumerate(dist) if d > radius]
p_in = [i for i, d in enumerate(dist) if d < radius]
Если оба спискасодержит элемент any
, тогда прямоугольник пересекает контур круга:
if any(p_in) and any(p_out):
print("COLLIDE")
Если len(p_in)
равно 4, то прямоугольник полностью находится в круге. Если len(p_out)
равно 4, то прямоугольник полностью выходит из круга.
if any(p_in) and any(p_out):
print("COLLIDE")
elif len(p_in) == 4:
print("IN")
elif len(p_out) == 4:
print("OUT")
См. Простой пример, который основан на вашем фрагменте кода и демонстрирует тест на столкновение. Прямоугольник прикреплен к мышке:
import pygame
import math
pygame.init()
gameDisplay = pygame.display.set_mode((500, 500))
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
x, y = pygame.mouse.get_pos()
w, h = 10, 30
rect = pygame.Rect(x, y, 10, 30)
a, b = 250, 250
radius = 210
corners = [rect.bottomleft, rect.bottomright, rect.topleft, rect.topright]
dist = [math.sqrt((p[0]-a)**2 + (p[1]-b)**2) for p in corners]
p_out = [i for i, d in enumerate(dist) if d > radius]
p_in = [i for i, d in enumerate(dist) if d < radius]
if any(p_in) and any(p_out):
print("COLLIDE")
elif len(p_in) == 4:
print("IN")
elif len(p_out) == 4:
print("OUT")
gameDisplay.fill((255,255,255))
pygame.draw.rect(gameDisplay, (255, 0, 0), rect)
pygame.draw.circle(gameDisplay, (0,0,0), (a, b), radius, 5)
pygame.display.flip()
pygame.quit()
quit()