我怎么知道在Pygame中是否碰过圆和矩形?

时间:2019-02-23 10:40:49

标签: python pygame geometry rect

程序中的表面上有一个圆和一个矩形。我想知道圆和矩形是否相互接触。它必须非常准确。很抱歉没有解释它的细节,但我希望你能理解。

1 个答案:

答案 0 :(得分:1)

考虑由左上角的原点以及宽度和高度给出的轴对齐矩形:

rect_tl   = (x, y)
rect_size = (width, height)

一个圆是由一个中心点和一个半径给出的:

circle_cpt = (x, y)
circle_rad = r

如果要测试这两个形状是否相交,则n为了捕获所有可能的情况,必须执行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
相关问题