Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >希尔伯特曲线 Hilbert Curve

希尔伯特曲线 Hilbert Curve

作者头像
为为为什么
发布于 2023-03-26 02:30:24
发布于 2023-03-26 02:30:24
6.5K04
代码可运行
举报
文章被收录于专栏:又见苍岚又见苍岚
运行总次数:4
代码可运行

希尔伯特曲线是一条填满整个平面的神奇曲线,可以理解为一种线段和正方形平面的一一映射,本文记录相关内容。

简介

希尔伯特曲线(Hilbert Curve)是一种连续的空间填充曲线,具有多个回旋和折叠的特点。它最初由德国数学家David Hilbert于1891年引入,并在之后的数学研究中广泛应用。希尔伯特曲线的独特之处在于它具有无限长度,但能以有限的空间覆盖整个平面。因此,希尔伯特曲线广泛应用于计算机科学、物理学、遥感、生物信息学等领域,用于分形分析、地图制作、信号处理等方面。

定义

其构造方式是把前一阶的曲线复制四份, 将左下角和右下角的曲线做一个沿对角线的翻转, 然后增加三条线段把这四份连起来.这些曲线的极限就是希尔伯特曲线。

希尔伯特曲线一种能填充满一个平面正方形的分形曲线(空间填充曲线)。由于它能填满平面,它的豪斯多夫维是2。取它填充的正方形的边长为1,第 n 步的希尔伯特曲线的长度是 2^n - 2^{-n}

n 阶的希尔伯特曲线是从 [0,1] 区间到 [0,1] \times[0,1] 平面区域的映射 f_{n} ,把 0 和 1 映射到区域左下角和右下角:

f_{n}(0)=(0,0), \quad f_{n}(1)=(1,0)

并且, 通过适当的调整,让每个 1/4 的小区间映射到 4 个区域内.

填充整个区域的希尔伯特曲线是这样的函数 f , 使得函数列 f_n 逐点收敛到它. 即:

$$ f(x):=\lim _{n \rightarrow \infty} f_{n}(x) $$

曲线性质

良定义

首先要说明这个定义是 well-defined , 即对于所有的 x , f_n(x) 确实收敛。我认为这个可以从区间来说明。不管 x 取定义域中的什么值, 都可以不断将区间四等分, 用长度为1/4,1/16,1/64 的区间套来套住, 由于不同阶 Hilbert 曲线的定义, 对应的函数值也落在相应的区域套内. 这样形成一系列闭区域的套, 总有一个确定的极限值.

这里有个问题就是,当 x 是两个四等分区间的交点时应该取左边的区间继续等分,还是取右边的区间继续等分. 这里应该能够证明取哪个得到的极限都是一样的, 这也是曲线连续性的要求.

填充整个区间

Hilbert 函数的取值遍布整个单位平面区域. 在 [0,1]×[0,1] 里面随便选一个点 (x,y) , 将平面不断四等分为上下左右四个闭区域, 用同样的方法, 能对应到定义域里的闭区间, 最后套出一个自变量 x_0 来, 使得 f(x_0)=(x,y) .

这里要是选择的点落在边界上应该选哪个区域继续四等分呢? 这时选不同的点就不一样了. 比如 点, 其实会有左右两个 ,都能逼近这个点. 这恰恰说明, Hilbert 曲线, 是满射(映上的), 不是单射(1-1的), 所以也不是双射.

仍然是曲线

曲线要求是 上的连续映射. 这里的连续性还比较好说. 对于值域中的点 , 选择一个任意小的 邻域, 都可以在里面找到更小的 大的(对齐的)闭区域, 对应到定义域是一个闭区间, 然后找到更小的 开区间, 这里的所有点都会映射到 领域中.

因为 Hilbert 曲线不是单射, 故不存在逆映射. 不能说 Hilbert 曲线让直线段和平面区域拓扑同胚了.

生成过程

考虑一个 的正方形,通过希尔伯特曲线映射到 区间

一阶

一阶的希尔伯特曲线,生成方法就是把正方形四等分,从其中一个子正方形的中心开始,依次穿线,穿过其余3个正方形的中心。

升阶

已经生成了上一阶 希尔伯特曲线 后生成下一阶,需要:

  1. 把之前每个子正方形继续四等分,每4个小的正方形先生成上一阶阶希尔伯特曲线;
  2. 每个小的四等分中第三第四象限的曲线分别沿两个对角线翻转;
  3. 添加三条线段把 4 个上一阶的希尔伯特曲线首尾相连。
四等分生成上一阶曲线
第三第四象限对角线翻转
添加三条线段

把 4 个上一阶的希尔伯特曲线首尾相连

这样就生成了下一阶希尔伯特曲线,以此类推,可以在 内生成无限阶希尔伯特曲线填满空间。

映射顺序

由于希尔伯特曲线是不断四等分划分而来,而且保持了固定的穿线顺序,因此没有处于边界上的二维点会被稳定地映射到一维线段中对应的某一段:

这样二维映射时就保证了一定的顺序,但处于分解线上的点事实上是双射,无法保证顺序了:

曲线长度

阶希尔伯特曲线长度为 ,这里给出我个人的计算方法:

线段个数

首先我计算 阶希尔伯特曲线的线段个数 ,根据定义:

$$ \begin{array}{c} M_1 = 3\ M_{n+1} = 4M_n + 3 \end{array} $$

可以得到:

$$ \begin{array}{c} \frac{M_{n+1} + 1}{M_{n} + 1} = 4\ M_{1}+1 = 4 \end{array} $$

是首项为 4,公比为 4 的等比数列,因此:

$$ \begin{array}{c} {M_{n} + 1} = 4^n\ M_{n}=4^n-1 \end{array} $$

阶希尔伯特曲线线段个数为

线段长度
紧贴曲线

如果希尔伯特曲线边缘紧贴 的正方形,如下图所示:

份,即:

同样的等比数列,可以推导得到

为:

真实曲线

考虑真实的希尔伯特曲线,其本身相当于把上文的紧贴曲线进行缩放某一个倍率,可以轻易得到第 阶曲线会将紧贴曲线缩小 倍。

曲线长度

结合上述结论,我们可以计算 阶希尔伯特曲线的长度了,这里用 表示:

$$ \begin{array}{c} L_n &=&M_nE_nS_n\ &=&(4^n-1)(\frac{1}{2^n-1})(\frac{2^n-1}{2^n})\ &=&2^n-2^{-n} \end{array} $$

曲线绘制

这里贴一段 ChatGPT4 写的一段 python 绘制希尔伯特曲线的代码,为了显示大方好看一点,一些参数我做了修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import turtle

def hilbert_curve(turtle, level, angle, step):
    if level == 0:
        return
    turtle.right(angle)
    hilbert_curve(turtle, level - 1, -angle, step)
    turtle.forward(step)
    turtle.left(angle)
    hilbert_curve(turtle, level - 1, angle, step)
    turtle.forward(step)
    hilbert_curve(turtle, level - 1, angle, step)
    turtle.left(angle)
    turtle.forward(step)
    hilbert_curve(turtle, level - 1, -angle, step)
    turtle.right(angle)

turtle.setup(400, 400)
turtle.penup()
turtle.goto(-140, 140)
turtle.pendown()
hilbert_curve(turtle, 3, 90, 40)
turtle.done()

绘制过程:

参考资料

文章链接: https://cloud.tencent.com/developer/article/2246110

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年3月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高效的多维空间点索引算法 — Geohash 和 Google S2
每天我们晚上加班回家,可能都会用到滴滴或者共享单车。打开 app 会看到如下的界面:
一缕殇流化隐半边冰霜
2018/08/30
3.6K0
高效的多维空间点索引算法 — Geohash 和 Google S2
高效的多维空间点索引算法 — Geohash 和 Google S2
如果同时有很多遍布全国的请求都在查找附近的餐馆,按照上述的做法,你的服务有能力及时响应么?
YoungTimes
2022/04/28
2.9K0
高效的多维空间点索引算法 — Geohash 和 Google S2
地理空间索引实现:z 曲线、希尔伯特曲线、四叉树, 最邻近几何特征查询、范围查询
在谈论空间索引之前,我们必须了解数据索引的概念:索引是为了提高数据集的检索效率。打个比喻,一本书的目录就是这本书的内容的“索引”,我们查看感兴趣的内容前,通过查看书的目录去快速查找对应的内容,而不是一字一句地找我们感兴趣的内容;就像这样,事先构建的索引可以有效地加速查询的速度。
云微
2023/02/11
2K0
地理空间索引实现:z 曲线、希尔伯特曲线、四叉树, 最邻近几何特征查询、范围查询
希尔伯特曲线(Hilbert曲线含解析)
希尔伯特曲线是以下一系列分形曲线 Hn 的极限。我们可以把 Hn 看作一条覆盖 2n × 2n 方格矩阵的曲线,曲线上一共有 2n × 2n 个顶点(包括左下角起点和右下角终点),恰好覆盖每个方格一次。
用户2965768
2019/08/29
5.3K0
希尔伯特曲线(Hilbert曲线含解析)
智能城市管理海量空间数据的利器-空间填充曲线
现实世界中存在大量的多维空间数据,如加油站位置、河流走向等。为了高效存储和管理海量的空间数据,很多基于Key-Value存储的空间数据库,如开源的空间插件GeoMesa[1]、京东城市自研的时空数据引擎JUST[2],都使用了空间填充曲线技术。它们能够将多维空间数据转换到一维空间上,并通过转换后的一维空间索引值存储和查询多维数据,因此能够在Key-Value数据库中存储管理海量的时空数据。
京东技术
2021/04/22
1.5K0
智能城市管理海量空间数据的利器-空间填充曲线
【系统设计】邻近服务
在本文中,我们将设计一个邻近服务,用来发现用户附近的地方,比如餐馆,酒店,商场等。
全球技术精选
2022/09/05
1.2K0
【系统设计】邻近服务
数形结合「求解」希尔伯特第13个数学难题
有一个问题是德国数学家大卫 · 希尔伯特在20世纪初预测的23个当时尚未解决的数学问题中的第13个,他预测这些问题将塑造这个领域的未来。
新智元
2021/01/25
7150
四叉树上如何求希尔伯特曲线的邻居 ?
关于邻居的定义,相邻即为邻居,那么邻居分为2种,边相邻和点相邻。边相邻的有4个方向,上下左右。点相邻的也有4个方向,即4个顶点相邻的。
一缕殇流化隐半边冰霜
2018/08/30
1.1K0
四叉树上如何求希尔伯特曲线的邻居 ?
Google S2 中的 CellID 是如何生成的 ?
笔者在《高效的多维空间点索引算法 — Geohash 和 Google S2》文章中详细的分析了 Google S2 的算法实现思想。文章发出来以后,一部分读者对它的实现产生了好奇。本文算是对上篇文章的补充,将从代码实现的角度来看看 Google S2 的算法具体实现。建议先读完上篇文章里面的算法思想,再看本篇的代码实现会更好理解一些。
一缕殇流化隐半边冰霜
2018/08/30
1.9K0
Google S2 中的 CellID 是如何生成的 ?
谁才是百年计算机的数学灵魂:莱布尼茨、图灵还是希尔伯特?
虽然计算机的出现,不到百年,然而为了它的出现,所进行的探索和研究,早已经历经数百年的历史。
深度学习技术前沿公众号博主
2020/11/20
8730
谁才是百年计算机的数学灵魂:莱布尼茨、图灵还是希尔伯特?
这个播放量200万的视频燃爆了!它讲透了:希尔伯特计划是如何被哥德尔与图灵“打脸”的?
1930年,临近退休前,著名数学家大卫·希尔伯特在于柯尼斯堡召开的全德自然科学及医学联合会代表大会上做了题为《自然认知及逻辑》的4分钟演讲。这场即将计入历史的演讲以希尔伯特的6字箴言结束:
AI科技评论
2021/07/02
1.1K0
数论重大突破:120年后,希尔伯特的第12个数学难题借助计算机获得解决
德国数学家大卫 · 希尔伯特(David Hilbert)是二十世纪最伟大的数学家之一,被后人称为「数学世界的亚历山大」。他对数学领域做出了广泛和重大的贡献,研究领域涉及代数不变式、代数数域、几何基础、变分法、积分方程、无穷维空间以及物理学和数学基础等。1899 年出版的《几何基础》成为近代公理化方法的代表作,且由此推动形成了「数学公理化学派」。
机器之心
2021/06/08
7500
谁能用人话给我说说希尔伯特空间??
版权声明:本文为CSDN博主「ChangHengyi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ChangHengyi/article/details/80577318
beyondGuo
2019/12/03
2.5K1
谁能用人话给我说说希尔伯特空间??
【笔记】《计算机图形学》(15)——曲线
这一章介绍了曲线的表示, 用到了比较多的数学. 前半部分主要是介绍了曲线的性质和表示方式, 并介绍了多项式插值曲线, 后半部分主要介绍了包括贝塞尔曲线和B样条曲线在内的拟合曲线. 样条曲线的内容在样条曲线曲面有过一些简单的介绍, 这一章没有介绍曲面部分, 但是在曲线部分则进行了更加详细的介绍, 我也对这部分有了更好的理解.
ZifengHuang
2021/06/29
3.1K0
Geospatial Data 在 Nebula Graph 中的实践
本文主要介绍了地理空间数据(Geospatial Data)以及它在 Nebula Graph 中的具体实践。
NebulaGraph
2022/02/22
8580
Geospatial Data 在 Nebula Graph 中的实践
递归的递归之书:第五章到第九章
分而治之算法是将大问题分解为更小的子问题,然后将这些子问题分解为更小的问题,直到变得微不足道。这种方法使递归成为一种理想的技术:递归情况将问题分解为自相似的子问题,基本情况发生在子问题被减少到微不足道的大小时。这种方法的一个好处是这些问题可以并行处理,允许多个中央处理单元(CPU)核心或计算机处理它们。
ApacheCN_飞龙
2024/01/11
4900
递归的递归之书:第五章到第九章
【我和Python算法的初相遇】——体验递归的可视化篇
递归是一种算法,它利用函数的自身调用来解决问题。递归的历史可以追溯到古代的数学家和逻辑学家,如希腊哲学家亚里士多德和印度数学家阿耶尔巴塔。然而,递归算法的实际应用可以追溯到早期的计算机科学,尤其是在20世纪40年代和50年代的计算机发展初期。
ImAileen
2024/01/18
3470
【我和Python算法的初相遇】——体验递归的可视化篇
密码学[3]:椭圆曲线
Short Weierstrass 椭圆曲线:F 是特征 q > 3 的有限域,a, b ∈ F,且 4a^3 + 27b^2 \ne 0 ,所有点 (x, y) ∈ F x F 满足方程 y^2 = x^3 + ax + b 所组成的集合,还有额外的一个点 O,称为无穷点:
谛听
2023/10/27
9660
python之turtle海龟绘图篇[通俗易懂]
python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),出现在1966年的Logo计算机语言。 海龟绘图(turtle库)是python的内部模块,使用前导入即可 import turtle 海龟有3个关键属性:方向、位置和画笔(笔的属性有色彩、宽度和开/关状态)
全栈程序员站长
2022/09/14
3.7K0
python之turtle海龟绘图篇[通俗易懂]
有限元法(FEM)
空间和时间相关问题的物理定律通常用偏微分方程(PDE)来描述。对于绝大多数的几何结构和所面对的问题来说,可能无法求出这些偏微分方程的解析解。不过,在通常的情况下,可以根据不同的离散化 类型来构造出近似的方程,得出与这些偏微分方程近似的数值模型方程,并可以用数值方法求解。如此,这些数值模型方程的解就是相应的偏微分方程真实解的近似解。有限元法(FEM)就是用来计算出这些近似解的。
技术客
2022/05/19
2K0
推荐阅读
相关推荐
高效的多维空间点索引算法 — Geohash 和 Google S2
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验