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读网页文件及保存成本地文
- 下一篇: AMESim R14 运行时出现许可证错