在我的程序中,有一个圆和一个矩形在表面上移动。我想知道一个圆和一个矩形是否相互接触。它必须非常准确。很抱歉没有详细解释,但希望您能理解。
最佳答案
考虑一个轴对齐的矩形由左上角原点以及宽度和高度给出:
rect_tl = (x, y)
rect_size = (width, height)
圆由中心点和半径给出:
circle_cpt = (x, y)
circle_rad = r
如果您想测试这两个形状是否重叠,您需要运行 2 个测试来捕获所有可能的情况。
首先必须测试圆的中心点是否在矩形内部。这可以通过 pygame.Rect.collidepoint
来完成轻松:
rect = pygame.Rect(*rect_tl, *rect_size)
isIsect = rect.collidepoint(*circle_cpt)
此外,还必须测试 any
是否有效。矩形的角点在圆的内部。如果角点与圆的中心点之间的距离小于或等于圆的半径,则属于这种情况。一个点可以用 pygame.math.Vector2
来表示两点之间的距离可以通过 pygame.math.Vector2.distance_to()
得到:
centerPt = pygame.math.Vector2(*circle_cpt)
cornerPts = [rect.bottomleft, rect.bottomright, rect.topleft, rect.topright]
isIsect = any([p for p in cornerPts if pygame.math.Vector2(*p).distance_to(centerPt) <= circle_rad])
结合这两个测试的函数可能如下所示:
def isectRectCircle(rect_tl, rect_size, circle_cpt, circle_rad):
rect = pygame.Rect(*rect_tl, *rect_size)
if rect.collidepoint(*circle_cpt):
return True
centerPt = pygame.math.Vector2(*circle_cpt)
cornerPts = [rect.bottomleft, rect.bottomright, rect.topleft, rect.topright]
if [p for p in cornerPts if pygame.math.Vector2(*p).distance_to(centerPt) <= circle_rad]:
return True
return False
关于python - 我如何知道 Pygame 中的圆和矩形是否被触摸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54840710/