Matplotlib Sierpinski三角形

时间:2020-02-25 20:21:07

标签: python

from tkinter import *
import timeit
import matplotlib.pyplot as plt
#------------------------------------------------------------------------
# ST_Recur
#------------------------------------------------------------------------
def midpoint(p1,p2):
    return ((p1[0]+p2[0])/2,(p1[1]+p2[1])/2)
def ST_Recur(level, p1, p2, p3):
    if level == 1:
        canvas.create_polygon(p1, p2, p3)
        canvas.update
    else:
        p4 = midpoint(p1, p2)
        p5 = midpoint(p2, p3)
        p6 = midpoint(p1, p3)
        ST_Recur(level - 1,p1,p4,p6)
        ST_Recur(level - 1,p4,p2,p5)
        ST_Recur(level - 1,p6, p5,p3)

#------------------------------------------------------------------------
# DrawSierpinskiTriangle
#------------------------------------------------------------------------
def DrawSierpinskiTriangle(event=None):
    global size
    level = int(levels.get())
    canvas.delete("all")
    p1 = (0.1*size, 0.9*size)   # bottom left
    p2 = (0.5*size, 0.1*size)   # top
    p3 = (0.9*size, 0.9*size)   # bottom right
    ST_Recur( level, p1, p2, p3)



#===================================================================================
root = Tk()
root.title("Sierpinski Triangle")

#---- entry box for level number
Label(root, text="Levels:").grid(row=1, column=1, sticky=W)
levels = StringVar()
levels_entry = Entry(root, width=7, textvariable=levels)
levels_entry.grid(row=1, column=2)

#---- button to draw
Button(root, text="Draw", command=DrawSierpinskiTriangle).grid(row=1, column=3)
#---- return key to draw
root.bind("<Return>", DrawSierpinskiTriangle)

#---- canvas to draw
size = 500
canvas = Canvas(root, width=size, height=size, borderwidth=1, highlightbackground='black', background='white')
canvas.grid(row=1, column=4)

#---- space out widgets
for child in root.winfo_children():
    child.grid_configure(padx=5, pady=5)

#---- start event loop
start = timeit.timeit()
a = ST_Recur
end = timeit.timeit()
print(start - end)

plt.plot(start - end)
plt.show()


root.mainloop()

有人可以帮我绘制这个Sierpinski Triangle程序的图形吗?我正在尝试确定程序是线性O(n ^ 2)还是指数O(Logn)。我不确定如何将ST_recure函数和运行时间集成到mat plot lib中。目的是测量运行时间和图表。

1 个答案:

答案 0 :(得分:1)

来自评论:

问题大小是要绘制的级别数

这是关键细节。在分析算法时,我们需要一种方法来测量不同输入的“大小”。对于家庭作业,您需要某种类型的循环,该循环以ST_Recur()的不同值调用level。您还需要为每个调用计时,并收集level与运行时间之间的数据。然后,您可以在线图中或类似图形中绘制该数据的图形。