Geometry (非正方形)任意比例的希尔伯特空间填充曲线
将非正方形曲面映射到向量/直线的希尔伯特空间/平面填充曲线是否有任何扩展[用于图像映射到向量] 有自适应希尔伯特曲线,但在我看来,这非常困难,对于其他用途,但你也可以将“正常”希尔伯特曲线映射到任何矩形。我今天自己也在寻找它。我找到了Lutz Tautenhan的这一页: 算法没有名字,他没有引用任何人,草图显示是他自己提出的。所以,除非有人对这个话题有更多的了解,否则我们称之为陶腾哈恩曲线?对于2的幂,它会变回希尔伯特曲线 仍然在挖掘凌乱的源代码,不知道Big-O开销等最终会是什么 看起来他从上到下尽可能“均匀”地划分空间,所以假设开销不是太大,这可能是您想要做的事情的一个很好的候选者 编辑:尽管我怀疑这么多年后你会看到这一点,但我最近在2000年的一篇论文中发现了另一种方法,这种方法在你的具体案例中可能非常有用: 由Revital Dafner、Daniel Cohen或Yossi Matias创作Geometry (非正方形)任意比例的希尔伯特空间填充曲线,geometry,computational-geometry,feature-extraction,Geometry,Computational Geometry,Feature Extraction,将非正方形曲面映射到向量/直线的希尔伯特空间/平面填充曲线是否有任何扩展[用于图像映射到向量] 有自适应希尔伯特曲线,但在我看来,这非常困难,对于其他用途,但你也可以将“正常”希尔伯特曲线映射到任何矩形。我今天自己也在寻找它。我找到了Lutz Tautenhan的这一页: 算法没有名字,他没有引用任何人,草图显示是他自己提出的。所以,除非有人对这个话题有更多的了解,否则我们称之为陶腾哈恩曲线?对于2的幂,它会变回希尔伯特曲线 仍然在挖掘凌乱的源代码,不知道Big-O开销等最终会是什么 看起来他
这是一种构造空间填充曲线的方法,该曲线相对于基础图像数据的变化而言是“最优的”。我已经编写了一种算法,可以为二维和三维任意大小的矩形生成一条类似希尔伯特的曲线。55x31的示例: 其思想是递归地应用类似希尔伯特的模板,但在将域维度减半时避免奇数大小。如果维度恰好是2的幂,则生成经典的希尔伯特曲线
def gilbert2d(x, y, ax, ay, bx, by):
"""
Generalized Hilbert ('gilbert') space-filling curve for arbitrary-sized
2D rectangular grids.
"""
w = abs(ax + ay)
h = abs(bx + by)
(dax, day) = (sgn(ax), sgn(ay)) # unit major direction
(dbx, dby) = (sgn(bx), sgn(by)) # unit orthogonal direction
if h == 1:
# trivial row fill
for i in range(0, w):
print x, y
(x, y) = (x + dax, y + day)
return
if w == 1:
# trivial column fill
for i in range(0, h):
print x, y
(x, y) = (x + dbx, y + dby)
return
(ax2, ay2) = (ax/2, ay/2)
(bx2, by2) = (bx/2, by/2)
w2 = abs(ax2 + ay2)
h2 = abs(bx2 + by2)
if 2*w > 3*h:
if (w2 % 2) and (w > 2):
# prefer even steps
(ax2, ay2) = (ax2 + dax, ay2 + day)
# long case: split in two parts only
gilbert2d(x, y, ax2, ay2, bx, by)
gilbert2d(x+ax2, y+ay2, ax-ax2, ay-ay2, bx, by)
else:
if (h2 % 2) and (h > 2):
# prefer even steps
(bx2, by2) = (bx2 + dbx, by2 + dby)
# standard case: one step up, one long horizontal, one step down
gilbert2d(x, y, bx2, by2, ax2, ay2)
gilbert2d(x+bx2, y+by2, ax, ay, bx-bx2, by-by2)
gilbert2d(x+(ax-dax)+(bx2-dbx), y+(ay-day)+(by2-dby),
-bx2, -by2, -(ax-ax2), -(ay-ay2))
def main():
width = int(sys.argv[1])
height = int(sys.argv[2])
if width >= height:
gilbert2d(0, 0, width, 0, 0, height)
else:
gilbert2d(0, 0, 0, height, width, 0)
有关3D版本和更多文档,请访问如何完成?我找不到任何非正方形的示例或教程。您可以将坐标视为二进制坐标并交错。然后将其视为基数为4的数字。这是一条z阶曲线。工作原理与希尔伯特曲线相似!阅读这个问题和答案:是的,但需要过多或过少的采样来适应新的维度。但我希望避免使用这种曲线,因为这可以回答问题,但最好在这里提供实际信息,而不仅仅是一个链接。我明白这一点,但问题是我自己还没有完全弄清楚它是如何工作的。演示的源代码写得很糟糕,解释是扫描纸上的草图。我正在研究它,但我想其他人可能比我更快地发现这一点,所以我分享了这个链接,意思是“答案就在这里的某个地方,也许你可以击败我解密这个。”@Job:我尝试了40x45,它也很有效。惊人的发现!你解密了吗?这个算法当然会产生美丽的曲线,这正是我所寻找的——我也在焦急地等待着有人发现它的记录不全的魔法酱。。。