python 画希尔伯特曲线
生活随笔
收集整理的这篇文章主要介绍了
python 画希尔伯特曲线
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
给你一个问题:
让你在一个N×N的点阵,让你画一条连续曲线,使得这条曲线经过这个点阵中的每个点,并且每个点只经过一次,N满足条件:N=2k,k⊂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 画希尔伯特曲线的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: python 3读网页文件及保存成本地文
- 下一篇: 利用python下载网页到本地(pyth