Python 通过二维/三维坐标访问内容的容器

Python 通过二维/三维坐标访问内容的容器,python,c,containers,Python,C,Containers,有很多游戏通常可以被视为一堆在空间中分布的对象,一个非常常见的操作是拾取子区域中的所有对象。典型的例子是一个游戏,在一张大地图上有成吨的单位,爆炸会影响到一定半径内的单位。这需要拾取半径中的每个单位,以便应用爆炸效果 现在,有几种存储对象的方法可以有效地拾取子区域。最简单的方法可能是将地图划分成网格;拾取区域中的单元将只涉及选择受影响的网格部分,并对区域内不100%的网格平铺进行细粒度坐标检查 对于这种方法,我不喜欢的是回答“网格块应该有多大?”太大,效率可能会成为一个真正的问题。太小,如果游戏

有很多游戏通常可以被视为一堆在空间中分布的对象,一个非常常见的操作是拾取子区域中的所有对象。典型的例子是一个游戏,在一张大地图上有成吨的单位,爆炸会影响到一定半径内的单位。这需要拾取半径中的每个单位,以便应用爆炸效果

现在,有几种存储对象的方法可以有效地拾取子区域。最简单的方法可能是将地图划分成网格;拾取区域中的单元将只涉及选择受影响的网格部分,并对区域内不100%的网格平铺进行细粒度坐标检查

对于这种方法,我不喜欢的是回答“网格块应该有多大?”太大,效率可能会成为一个真正的问题。太小,如果游戏世界足够大,网格会占用大量内存(如果游戏是3d的,网格会变得很可笑)。甚至可能没有一个合适的中庸之道

上述问题的明显解决方案是使用某种智能细分(如伪树结构)生成大型网格。在这一点上,我确信我已经进入了过早优化的阶段。(然后是适当的动态四元树/八叉树,但编码更复杂,我甚至不相信它会表现得更好。)

所以我的问题是:上述问题有标准解决方案吗?在STL容器的行中,可以存储任何带有坐标的对象,并检索特定区域内的对象列表的东西?它不必与我上面描述的有所不同,只要它是经过深思熟虑并被认为“足够好”的东西


如果在Python中实现了该算法,那么就有好处了,但C也可以。编写实用程序的第一步是接受对某些常量的选择来自现实世界的考虑,而不是超越数学真理。这尤其适用于游戏设计/世界模拟类型的编码,如果你坚持尝试对现实世界进行最佳建模,你将一事无成。:-)

如果你的对象大小都相当一致,我会选择一个与平均对象大小成比例的网格大小,然后使用它。这是最简单的——请记住,简单会为您带来一些速度,即使您最终搜索的对象比绝对需要的多

如果你的物体大小差别很大,事情就会变得更加困难。例如,如果你试图用同一个引擎来对付子弹、老鼠、人类、巨型怪物、车辆、小行星、行星等。如果是这样,一种普遍接受的(但丑陋的)方法是根据你所处的情况有不同的“模式”。除此之外,一个想法可能是在网格单元积累了太多的小对象后,使用带有二叉树细分的大网格

旁白:如果使用浮点坐标,则需要小心网格大小的精度和舍入问题,因为靠近原点的点比远离原点的点精度高很多,这可能会导致网格单元遗漏某些对象的错误。

这将回答您的问题。
具体看一下第18章关于碰撞检测和交叉口的内容。

我对游戏编程一无所知,但我可以想象(基于直觉和我过去读到的内容),一个完整的网格对于大空间来说会变得非常低效;您将损失存储空间和时间,因为您将融化缓存


STL容器基本上是一维的。是的,像
set
map
这样的东西允许您定义任意排序关系,但它仍然只在一个维度中排序。如果您想做得更好,可能需要使用四叉树、kd树或类似的东西。

感谢您的仔细回复。你基本上证实了我自己的想法。请问您是否有游戏开发经验?我问这个问题的原因首先是想弄清楚我是否错过了一些精彩的/显而易见的解决方案。然而,如果答案是“否”,并且来自具有相关经验的人,这就是我想知道的。我年轻时曾有过制造“理想”发动机的经验。:-)我也是一个老派的厄运/地震国防部的人,所以我非常熟悉他们的工作方式。