【发布时间】:2014-05-11 21:14:47
【问题描述】:
我在 3d 空间中有百万个点的集合。
每个点都是一个对象
Struct Point
{
double x;
double y;
double z;
};
百万个点以某种随机顺序存储在一个 c++ 向量 MyPoints 中。
我想根据空间中点的空间分布对这百万个点进行排序,这样物理上更近的点在排序后也应该更靠近我的数组。
我对如何做到这一点的第一个猜测如下:首先对 Z 轴排序点,然后沿 Y 轴排序点,然后沿 X 轴排序点
MyPointsSortedAlongZ = Sort(MyPoints, AlongZAxis )
MyPointsSortedAlongY = Sort(MyPointsSortedAlongZ , AlongYAxis )
MyPointsSortedAlongX = Sort(MyPointsSortedAlongY , AlongYAxis )
首先,我不知道这种方法是否正确。我的最终点数组 MyPointsSortedAlongX 会在空间上完美排序(或几乎在空间上排序)吗?
其次,如果这种方法是正确的,它是不是最快的方法。有什么更好的方法来做到这一点?
【问题讨论】:
-
没有办法做到这一点并获得空间距离到线性(一维数组)距离的完美映射,因为您正在降低维度。您可能对 space-filling curves 感兴趣,以此作为大致实现这一目标的方法。
-
另一种方法是将您的空间离散化为一个 3d 数组,并在每个单元格中存储该单元格中的点或对它们的一些引用。就我个人而言,我喜欢 @OliCharlesworth 建议更好地使用空间填充曲线,但它们可能很难编程。
-
我没有在帖子中提到空间填充曲线,尽管我知道这一点。我在想是否构造一棵 Barnes-Hut 树然后按顺序遍历该树是否会导致空间排序(但也许我错了)。
-
如果您还没有实施您的解决方案,您是否看过这篇关于 Morton ordering 的相关 SO 帖子? stackoverflow.com/questions/1024754/…
-
@Rethunk:我确实看过那个解决方案。我想出了更好的实现,可以使用可变大小的 morton 代码。我会在它正常工作时分享它
标签: algorithm sorting 3d computational-geometry