给你一个问题:
让你在一个N×NN\times N的点阵,让你画一条连续曲线,使得这条曲线经过这个点阵中的每个点,并且每个点只经过一次,N满足条件:N=2k,k⊂ZN=2^k, k\subset \mathbb{Z}。

德国的数学家 David Hilbert就构造了一条满足上面要求的曲线。如下图

1阶希尔伯特曲线

2阶希尔伯特曲线

3阶希尔伯特曲线

4阶希尔伯特曲线

看出来了没有,其实希尔伯特曲线的构造方法是一个递归过程,要构造n阶的希尔伯特曲线,先构造4个n-1阶的希尔伯特曲线,这4个n-1阶的希尔伯特曲线通过特定的顺序连接起来。其实连接顺序就只有4种,跟1阶希尔伯特相似,不过开口方向不同而已。

有了这个认识,编程就不难了,python的代码如下:

# encoding=utf-8from tkinter import *def show_order(startx, starty, shape, order):global segx, segyif order == 1:if shape == 1:canvas.create_line(10 + startx * segx, 10 + starty * segy,10 + startx * segx, 10 + (starty + 1) * segy,tags="pic")canvas.create_line(10 + startx * segx, 10 + (starty + 1) * segy,10 + (startx + 1) * segx, 10 + (starty + 1) * segy,tags="pic")canvas.create_line(10 + (startx + 1) * segx, 10 + (starty + 1) * segy,10 + (startx + 1) * segx, 10 + starty * segy,tags="pic")elif shape == 2:canvas.create_line(10 + startx * segx, 10 + starty * segy,10 + (startx + 1) * segx, 10 + starty * segy,tags="pic")canvas.create_line(10 + (startx + 1) * segx, 10 + starty * segy,10 + (startx + 1) * segx, 10 + (starty + 1) * segy,tags="pic")canvas.create_line(10 + (startx + 1) * segx, 10 + (starty + 1) * segy,10 + startx * segx, 10 + (starty + 1) * segy,tags="pic")elif shape == 3:canvas.create_line(10 + startx * segx, 10 + (starty + 1) * segy,10 + startx * segx, 10 + starty * segy,tags="pic")canvas.create_line(10 + startx * segx, 10 + starty * segy,10 + (startx + 1) * segx, 10 + starty * segy,tags="pic")canvas.create_line(10 + (startx + 1) * segx, 10 + starty * segy,10 + (startx + 1) * segx, 10 + (starty + 1) * segy,tags="pic")elif shape == 4:canvas.create_line(10 + (startx + 1) * segx, 10 + starty * segy,10 + startx * segx, 10 + starty * segy,tags="pic")canvas.create_line(10 + startx * segx, 10 + starty * segy,10 + startx * segx, 10 + (starty + 1) * segy,tags="pic")canvas.create_line(10 + startx * segx, 10 + (starty + 1) * segy,10 + (startx + 1) * segx, 10 + (starty + 1) * segy,tags="pic")else:if shape == 1:show_order(startx, starty, 2, order-1)canvas.create_line(10 + startx * segx, 10 + (starty + EXP[order-1] - 1) * segy,10 + startx * segx, 10 + (starty + EXP[order-1]) * segy,tags="pic")show_order(startx, starty + EXP[order-1], 1, order-1)canvas.create_line(10 + (startx + EXP[order-1] - 1) * segx, 10 + (starty + EXP[order-1]) * segy,10 + (startx + EXP[order-1]) * segx, 10 + (starty + EXP[order-1]) * segy,tags="pic")show_order(startx + EXP[order-1], starty + EXP[order-1], 1, order-1)canvas.create_line(10 + (startx + EXP[order] - 1) * segx, 10 + (starty + EXP[order-1]) * segy,10 + (startx + EXP[order] - 1) * segx, 10 + (starty + EXP[order-1] - 1) * segy,tags="pic")show_order(startx + EXP[order-1], starty, 4, order-1)elif shape == 2:show_order(startx, starty, 1, order-1)canvas.create_line(10 + (startx + EXP[order-1] - 1) * segx, 10 + starty * segy,10 + (startx + EXP[order-1]) * segx, 10 + starty * segy,tags="pic")show_order(startx + EXP[order-1], starty, 2, order-1)canvas.create_line(10 + (startx + EXP[order-1])*segx, 10 + (starty + EXP[order-1] - 1) * segy,10 + (startx + EXP[order-1])*segx, 10 + (starty + EXP[order-1]) * segy,tags="pic")show_order(startx + EXP[order-1], starty + EXP[order-1], 2, order-1)canvas.create_line(10 + (startx + EXP[order-1] - 1) * segx, 10 + (starty + EXP[order] - 1)*segy,10 + (startx + EXP[order-1]) * segx, 10 + (starty + EXP[order] - 1) * segy,tags="pic")show_order(startx, starty + EXP[order-1], 3, order-1)elif shape == 3:show_order(startx, starty + EXP[order-1], 2, order-1)canvas.create_line(10 + startx * segx, 10 + (starty + EXP[order-1]) * segy,10 + startx * segx, 10 + (starty + EXP[order-1] - 1) * segy,tags="pic")show_order(startx, starty, 3, order-1)canvas.create_line(10 + (startx + EXP[order-1] - 1) * segx, 10 + (starty + EXP[order-1] - 1) * segy,10 + (startx + EXP[order-1]) * segx, 10 + (starty + EXP[order-1] - 1) * segy,tags="pic")show_order(startx + EXP[order-1], starty, 3, order-1)canvas.create_line(10 + (startx + EXP[order] - 1) * segx, 10 + (starty + EXP[order-1] - 1) * segy,10 + (startx + EXP[order] - 1) * segx, 10 + (starty + EXP[order-1]) * segy,tags="pic")show_order(startx + EXP[order-1], starty + EXP[order-1], 4, order-1)elif shape == 4:show_order(startx + EXP[order-1], starty, 1, order-1)canvas.create_line(10 + (startx + EXP[order-1])*segx, 10 + starty*segy,10 + (startx + EXP[order-1] - 1) * segx, 10 + starty * segy,tags="pic")show_order(startx, starty, 4, order-1)canvas.create_line(10 + (startx + EXP[order-1] - 1) * segx, 10 + (starty + EXP[order-1] - 1) * segy,10 + (startx + EXP[order-1] - 1) * segx, 10 + (starty + EXP[order-1]) * segy,tags="pic")show_order(startx, starty+EXP[order-1], 4, order-1)canvas.create_line(10 + (startx + EXP[order-1] - 1) * segx, 10 + (starty + EXP[order] - 1) * segy,10 + (startx + EXP[order-1]) * segx, 10 + (starty + EXP[order] - 1) * segy,tags="pic")show_order(startx + EXP[order-1], starty + EXP[order-1], 3, order-1)def display():if ord1.get() == "":returncanvas.delete("pic")global segx, segysegx = (WIDTH - 20) / (EXP[int(ord1.get())] - 1)segy = (HEIGHT - 20) / (EXP[int(ord1.get())] - 1)show_order(0, 0, 1, int(ord1.get()))
segx = None
segy = NoneEXP = 10 * [1]
for i in range(1, 10):EXP[i] = EXP[i-1] * 2WIDTH = 700
HEIGHT = 700window = Tk()
window.title("希尔伯特曲线")
canvas = Canvas(window, width=WIDTH, height=HEIGHT, bg="white")
canvas.pack()frame = Frame(window)
frame.pack(anchor=W)
lbl1 = Label(frame, text="Enter the order: ")
lbl1.pack(side=LEFT)
ord1 = StringVar()
entry1 = Entry(frame, textvariable=ord1, width=10)
entry1.pack(side=LEFT)
but1 = Button(frame, text="Display", command=display)
but1.pack()
window.mainloop()

程序运行截图

python 画希尔伯特曲线相关推荐

  1. pythonturtle怎么画曲线_『怎么用python中的turtle画希尔伯特曲线』python画曲线图教程...

    Python 3 简单编程 画曲线图帮助! 曲线图--- 代码----from math import factorial import numpy as np import matplotlib.p ...

  2. python 画pr曲线

    roc曲线: python 画roc曲线_jacke121的专栏-CSDN博客 import _pickle as cPickle import matplotlib.pyplot as pltxxx ...

  3. python画PR曲线(precision-recall曲线)

    使用python画precision-recall曲线的代码是: sklearn.metrics.precision_recall_curve(y_true, probas_pred, pos_lab ...

  4. python画pr曲线_python 画函数曲线示例

    python 画函数曲线示例 如下所示: import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi ...

  5. 如何通过python画loss曲线 点线颜色及点线型设置说明(超实用)

    1 通过python画loss曲线 首先导入一些python画图的包,读取txt文件,假设我现在有两个模型训练结果的records.txt文件 import numpy as np import ma ...

  6. python画函数曲线-python画蝴蝶曲线图的实例

    蝴蝶曲线是由Temple H・Fay发现的可用极坐标函数表示的蝴蝶曲线. 由于此曲线优美, 因此就想把它作为博客favicon.ico,这里我使用pytho matplotlib.pyplot包来绘制 ...

  7. python画曲线-如何通过python画loss曲线的方法

    1. 首先导入一些python画图的包,读取txt文件,假设我现在有两个模型训练结果的records.txt文件 import numpy as np import matplotlib.pyplot ...

  8. python画函数曲线-使用Python画数学函数曲线

    import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.figure(1) # 创建图表1 plt.fig ...

  9. python 画ks曲线_Python绘制KS曲线的实现方法

    python实现KS曲线,相关使用方法请参考上篇博客-R语言实现KS曲线 代码如下: ####################### PlotKS ########################## ...

最新文章

  1. java 获取java文件路径_Java怎么获取相对路径下所有的.java文件的信息
  2. 计算机科学 第四次,计算机科学与技术第4次上机实验(25页)-原创力文档
  3. Unity3d HDR和Bloom效果(高动态范围图像和泛光)
  4. Flomaster 2020中文版
  5. Java设计模式(7)装饰模式(Decorator模式)
  6. ARM Cortex-M3相比于ARM其他系列微控制器的优势和特点
  7. javaweb中实现分页,持续更新……
  8. JavaOne 2012:向上,向上和向外:使用Akka扩展软件
  9. [c#基础]使用抽象工厂实现三层
  10. 【转】iOS编译OpenSSL静态库(使用脚本自动编译)
  11. python:threading.Thread类的使用详解
  12. 数学到底有多重要?网友:道理都懂,实力不允许啊…
  13. 手把手教学暴力破解WIFI密码(仅供学习交流)
  14. 搭建自己的KMS服务器
  15. Mysql分表,分区的区别和联系
  16. 微信新功能曝光:定时发送消息
  17. (C语言)实现基于PHP的某公司自来水收费管理系统
  18. MyBatis-Plus 扩展篇 > 自动填充功能
  19. HTTP协议——请求格式及方法
  20. 夏季干燥口腔溃疡频发怎么办

热门文章

  1. MTK Android添加驱动模块
  2. python 线程死锁_python线程死锁与递归锁
  3. excel最常用的八个函数_Excel最常用的几个函数,我都帮你整理好了!
  4. winSockets编程(二)socket函数
  5. RecyclerView悬浮标题
  6. poj1740 A New Stone Game
  7. RPi 2B GPIO 测试
  8. Objective-C:三种文件导入的方式以及atomic和nonatomic的区别
  9. Json解析异常处理方式(JSONException: Value of type java.lang.String cannot be converted to JSONObject)...
  10. 如何在Mac下显示Finder中的所有文件