欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

python 画希尔伯特曲线

发布时间:2025/4/16 python 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 python 画希尔伯特曲线 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

给你一个问题:
让你在一个N×N的点阵,让你画一条连续曲线,使得这条曲线经过这个点阵中的每个点,并且每个点只经过一次,N满足条件:N=2kkZ

德国的数学家 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()

程序运行截图

《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的python 画希尔伯特曲线的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。