python - Pygame浮点精度碰撞检测
问题描述
我正在构建一个物理模拟,并想做一个 pygame 可视化。对于我使用的位置和速度计算Vector2
,效果很好。使用内置的矩形碰撞检测会很有帮助。不幸的是,我必须先将矩形的当前位置四舍五入到一个像素。由于在我的模拟中将 1 个像素设置为 1 米,因此我只能确定 1 米内的物理碰撞。有谁知道我该如何解决这个问题?我唯一的想法是将 1 米的比例更改为 10 像素以获得 10 厘米的精度,但我只能在 1000 像素处显示 100m。也许有人知道一个很好的解决方案!谢谢您的帮助!
解决方案
如果您的代码用于解决模拟,您应该将模拟与可视化分开。因为现在您正在经历这样一个事实,即由于可视化问题,您必须限制模拟。情况不应该如此。
我的建议是使用 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 或任何其他框架。
当您分离模拟逻辑时,您可以轻松地扩展您的可视化。因为您从模拟中获取所有点并乘以可视化/缩放因子。
推荐阅读
- swift - 如何在 Swift5 中映射字典?
- html - 为什么我无法使用 ReactJs 在我的 html 中渲染微调器 (.gif)?
- c - 在交叉编译的可执行文件上运行 valgrind
- json - 我需要获取 API 以从响应中获取与 POSTMAN 中的结果相同但失败的原始值?
- c# - C# MVC Ajax 表单模态下拉列表验证错误
- ruby - Ruby 中的数组行为
- typo3 - 如何使用 TYPO3 Fluid form.upload 上传文件并将其传递给 Extbase 控制器
- javascript - 点击处理程序到一组精灵
- ios - 将海拔增益信息添加到 HKWorkout
- angular - 如何在 Ionic 4 中实现加载按钮?