![]() |
1
-1
你应该仔细研究莫顿码算法。埃里克森实时碰撞检测很好地解释了这一点。 Ericson - Real time Collision detection 下面是另一个很好的解释,包括一些测试: Morton encoding/decoding through bit interleaving: Implementations
Z-Order算法仅定义坐标的路径,在该路径中,您可以将2或3D坐标哈希到一个整数。虽然每次迭代算法都会更深入,但您必须自己设置限制。通常停止索引由哨兵表示。让哨兵停下来会告诉你粒子的位置。因此,您要定义的最大级别将告诉您每个维度的单元格数。例如,如果最大级别为6,则2^6=64。系统(3D)中将有64x64x64个单元格。这也意味着您必须使用基于整数的坐标。如果使用浮点,则必须进行如下转换
如果您知道系统中有多少个单元格,则可以定义您的限制。你想使用二进制八叉树吗?
如果要构建最近邻居的列表,必须将粒子映射到单元。这是通过一个表完成的,该表随后按单元格到粒子进行排序。仍然应该迭代粒子并访问其邻居。 关于您的代码: 记住唐纳德·克努特。您应该测量瓶颈所在。您可以使用NVCC Profiler查找瓶颈。不确定OpenCL有什么样的分析器。
我认为你不应该这样分支,当你调用时返回零怎么样
只有当您没有对粒子数据的写入访问权限时,在单元上并行运行才是一个好主意,否则您必须使用原子。如果你越过粒子范围,你会读取对细胞和邻居的访问,但你会并行地创建总和,并且你不会被迫使用某些竞赛条件范例。
实际上取决于你的算法和你的域中的粒子填充,但在你的情况下,我会定义与粒子直径相等的单元大小,只使用你得到的单元数。 因此,如果您想使用Z顺序并实现圣杯,请尝试使用整数坐标并散列它们。
|
![]() |
Dania · 在MATLAB中用小立方体填充立方体的整个体积 9 年前 |
![]() |
berserker · 找到坐标中值以构建kd树(2D)-C++ 9 年前 |
![]() |
user3037172 · K最近邻伪码? 11 年前 |