首页 > 解决方案 > Pygame浮点精度碰撞检测

问题描述

我正在构建一个物理模拟,并想做一个 pygame 可视化。对于我使用的位置和速度计算Vector2,效果很好。使用内置的矩形碰撞检测会很有帮助。不幸的是,我必须先将矩形的当前位置四舍五入到一个像素。由于在我的模拟中将 1 个像素设置为 1 米,因此我只能确定 1 米内的物理碰撞。有谁知道我该如何解决这个问题?我唯一的想法是将 1 米的比例更改为 10 像素以获得 10 厘米的精度,但我只能在 1000 像素处显示 100m。也许有人知道一个很好的解决方案!谢谢您的帮助!

标签: pythonpygamesimulation

解决方案


如果您的代码用于解决模拟,您应该将模拟与可视化分开。因为现在您正在经历这样一个事实,即由于可视化问题,您必须限制模拟。情况不应该如此。

我的建议是使用 numpy 和 scipy 的组合在没有 pygame 的情况下运行模拟(甚至是来自 pygame 的 Vector2 或 Rect)。如果您需要在模拟中检测碰撞,您可以非常快速地自己实现矩形碰撞:

class Rectangle(object):
    def __init__(self, left, bottom, width, height):
        self.left = left
        self.bottom = bottom
        self.width = width
        self.height = height

    @property
    def right(self):
        return self.left + self.width

    @property
    def top(self):
        return self.bottom + self.height

    def collide_with_rectangle(self, other):
        if self.left > other.right or self.right < other.left or self.bottom > other.top or self.top < other.top:
            return False
        return True

这种方法的优点是,您可以将可视化与模拟逻辑分开。例如,如果您发现 pygame 不符合您的需求,您可以非常轻松地切换到 matplotlib 或任何其他框架。

当您分离模拟逻辑时,您可以轻松地扩展您的可视化。因为您从模拟中获取所有点并乘以可视化/缩放因子。


推荐阅读