python - 您将以何种方式提出一种算法来检测不同对象之间的碰撞?

标签 python collision-detection

在从事一个真正纯粹的娱乐项目时,我遇到了一些问题。

二维世界充满了圆球、尖三角形和细线(也许还有其他野生动物)。它们都是 WorldCreatures 的子类。他们可以在这个世界中移动。当它们相遇时,就会发生碰撞。

我想做的是找到一种方法来检测它们之间的碰撞。这是我现在的立场:

  • 对我来说,Ball-Ball 很简单,我只需计算它们与位置的距离,并将其与它们的“大小”之和进行比较。
  • Ball 和世界边缘之间的碰撞也很简单 - 我只是检查与它的距离,这在笛卡尔坐标系中很简单。
  • 更一般的问题是 - 如何检测线(在某些点开始和结束)或我可能在那里的其他对象之间的碰撞?线和点之间的距离也可以很容易地计算出来,但我想要的是有

如果对象 A 与对象 B 发生碰撞,则用某种通用的方式来表示。现在的代码看起来有点像:

class WorldCreature:
    def detectCollision(self, otherObject):
        # do something 
        if collision:
            self.onCollision(otherObject)
            otherObject.onCollision(self)
class Ball(WorldCreature):
    # someing here
class Line(WorldCreature):
    # someing here

现在,碰撞检测机制应该取决于哪些对象会发生碰撞。效果也会如此。

我是否应该只在内存中保留所有对象的列表并在每一个步骤中循环遍历所有对象?或者,是否有更好的方法来提高此任务的性能?

最佳答案

使用 quadtree .它们用于消除您知道在碰撞半径之外的大区域,此外,它们还可以让您快速搜索最近点。

就实际碰撞检测而言,由于您只使用凸物体,请查看 Metanet Software's tutorialthe separating axis theorem .在他们的旗舰游戏中,他们实际上使用网格来查找所有要检查碰撞的对象,但使用四叉树应该不会太难。

(我记得读过一篇关于四叉树的文章,该文章使用网格中的圆来说明如何找到半径内的点。但我似乎找不到。)

关于python - 您将以何种方式提出一种算法来检测不同对象之间的碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/646539/

相关文章:

python - 使用 SWIG 绑定(bind) Python/C++ 模板

java - 如何在Translate Transition(JavaFX中)中实现碰撞检测?

Javascript对象颜色动态变化?

objective-c - 路径上的矩形碰撞检测

碰撞后 Swift 设置 isdynamic 为 false

c# - 检测来自不同物体的碰撞?

Python 函数之间发出信号以消除忙等待

python - 使用 Pandas 计算 TimeField 小时/分钟总和

python - "No module named ' stem '"in Python3 on macOS

python - 将整个 JSON 文件上传到 Firebase