排序后跟踪索引

时间:2015-03-25 22:19:36

标签: arrays algorithm sorting

所以我在3D空间(vec3(x,y,z))中有几个位置,速度等数组,另一个数组包含用于在vec3数组中查找的索引。这就是代表布料的粒子系统(如果有人想知道的话)。

第二个数组远大于位置数组,因为对于每个粒子,第二个数组表示与另一个粒子的“弹簧”关系类型。因此,例如,任何给定的粒子可能具有附着于3个不同粒子的“弹簧”。所以第二个数组中的第一批索引可能如下所示:[0,1,0,2,0,3,0,4,...]

这里的问题是位置数组是基于用于在统一网格中查找邻居的散列函数来排序的。这意味着第二个数组中保存的索引将不再有效。我试图找出一种方法来对位置进行排序,然后仍然使用第二个数组来正确索引。

有人认为我有一个第三个数组存储基于排序函数的新索引,但我不确定我是如何实际做到的。

此外,数据分离而不是放入对象的原因是这是在CUDA中运行的,它是速度/内存的优化。

有没有一种简单的方法可以解决这个问题?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

这样的事情会起作用吗?

vec3(x, y, z)的数组转换为pair(index, vec3(x, y, z))数组。通过获取第二个元素的哈希函数对这个新数组进行排序。结果将是pair(index, vec3(x, y, z))的排序数组,其中index是数组中向量的初始位置。然后,使用它来构建第三个"查找"整数数组,其索引是初始索引,其值是新值。现在要从第二个数组中获取一个向量,你可以执行vector_pairs[lookup[spring[4]]].second之类的操作。

Python-ish伪代码:

vecs = ...
spring = ...
pair_vecs = [(index, vec) for index, vec in enumerate(vecs)]
pair_vecs.sort(key=lambda index, vec: hash(vec))
lookup = [0] * len(pair_vecs)
for new_index, (initial_index, vec) in enumerate(pair_vecs):
    lookup[initial_index] = new_index