python - 我如何知道 Pygame 中的圆和矩形是否被触摸?

标签 python pygame geometry rect

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

最佳答案

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

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/

相关文章:

processing - 贝塞尔曲线与圆的交点

python - Python 如何使用 Windows Media Player 打开并播放 mp3 文件列表

python - 剥离 pandas 数据帧索引 '\n' 和空格

Python SQLite3 - 表输出格式问题和处理 IntegrityError

python - 重新排列列表中元素的更好方法

python - 如何在pygame中找到用户输入位置上的按钮并更改其颜色?

python - (Pygame) 鼠标悬停检测的问题

python-3.x - pygame 在菜单之间切换导致崩溃 : "video system not initializated"

c++ - 使用 boost 几何检查两条线是否有交点

c++ - 如何有效地找到位于圆形扇区内并保持其相对位置信息的二维网格图 block ?