【发布时间】:2019-03-05 02:14:05
【问题描述】:
我正在实现一个碰撞检测算法,将所有对象之间的距离存储在一个八叉树节点中。例如,如果节点中有 4 个对象,则对象 1&2、1&3、1&4、2&3、2&4 和 3&4 之间存在距离。对的总数的公式是 t = n * (n-1) / 2,其中 t 是对的总数,n 是一个节点中的对象数。
我的问题是,如何从列表中的位置转换为一对对象。例如,使用上面的对列表,3 将返回对 2&3。
为了节省内存空间,列表只是距离的浮点列表,而不是包含距离和指向 2 个对象的指针。
我不确定如何在数学上将单个列表索引转换为一对数字。任何帮助都会很棒。我希望能够将其分解为 2 个函数,第一个返回对中的第一个对象,第二个返回第二个,这两个函数都采用 2 个变量,一个是索引,另一个是总对象节点。如果可能的话,我想制作一个没有任何循环或具有递归函数的函数,因为这将为我的碰撞检测算法实时运行。
【问题讨论】:
-
我是否正确理解您正在寻找“索引”节点列表的排序 nC2( (8 2) 是最大值, (2 2) 是最小值,假设总是有孩子) 以便给定索引 'n' 您想要该排序组合列表中的对?是这样吗?
-
@WhozCraig:不,该列表只是对应于一对两个对象的任意距离值的数组。为了减少内存消耗,我只存储表示距离的浮点值,而不是排序的对,而不是距离和 2 个指向对象的指针,这很容易使内存消耗增加一倍甚至三倍。问题是通过数学上以升序计算配对来确定数组条目代表哪两个对象,第一个配对项目具有优先级。
-
所以 [d1, d2, d3, d4...] 将是 [1&2, 1&3, 1&4, 2&3....] 之间的距离,并且给定距离,返回 [n&m]和它一起去吗?我越来越近了吗?
-
@WhozCraig:是的,除了给定数组中的索引(即 1 将返回 1&2 并且 3 将返回 1&4)之外,几乎都一样
-
@WhozCraig:唯一的问题是对象的数量可以改变,因此需要动态计算对。我不想将这对存储在数组中。这样做对节省内存消耗毫无用处
标签: c++ math collision-detection