空间填充曲线在许多图形应用程序中很重要,因为它们有助于显示空间局部性。我们经常听到使用Z曲线,Morton代码,希尔伯特曲线等的不同算法。这些不同曲线之间的区别是什么,它们如何应用于各种应用?

评论

尝试一下《空间填充曲线-科学计算中的应用简介》一书。

另请参见Samet的多维和度量数据结构基础的第2.1.1.2节。

#1 楼

区别在于映射保留本地性的程度以及对密钥进行编码/解码的难易程度。 HV Jagadish在论文“具有多个属性的对象的线性聚类”中说:“通过代数分析,并通过计算机模拟,我们表明,在大多数情况下,希尔伯特映射的表现与建议的最佳替代映射相同或更好。文献”。另一方面,z-order使用起来比较简单,例如,比较z-order的Bit Twiddling Hacks和Hilbert-order的Wikipedia中列出的各种方法。

对于应用程序,我认为使用空间填充曲线的主要优点是它们将点从较高维的空间映射到较低维的空间。例如,它们使使用传统的B树数据库索引对点进行窗口查询成为可能。再次,另一方面,缺点是需要提前知道输入范围,因为以后很难“调整”映射的大小。

PS:“ Z曲线”是与“ Morton代码”相同。

PPS:其他映射包括Peano曲线,有关应用程序,请参见Geohash。

#2 楼

当您沿着曲线线性“行走”时,这些空间填充曲线可以在多个维度上保持局部性。

从我所见,Z-Order(也称为Morton代码)是最常用的,因为直接访问曲线任意点的计算成本不变(且便宜)。 (并且易于在硬件中实现,周期损失为0,因为它对应于“仅切换”地址线)。

Z-Order曲线的一个具体示例是纹理模糊:基本上增加了缓存在GPU上读取纹理的命中率。
(请参阅有关Z曲线的文章中的图像https://en.wikipedia.org/wiki/Z-order_curve)

如果纹理只是线性存储,如果仅将纹理渲染为2D图像,则可获得最大的缓存命中率,但是如果将其在屏幕上旋转90度,则会陷入最坏的情况(每次读取的纹理均出现缓存未命中)。 />
因此,最好权衡取舍,降低最佳情况,并为大多数模式提供更好的缓存命中率。

作为个人说明,从我已经看到,其他曲线的计算可能需要递归步骤,并导致比Z曲线更大的成本,并且在局部一致性方面的收益最小。因此,除了作为数学或创意/有趣/渲染的研究主题之外,我还没有听说过将这些曲线用于实际用途。