# L-9 MCS 275 Mon 1 Feb 2010 : koch.py from Tkinter import * import math class KochCurve(): """ GUI to draw a Koch curve on canvas. """ def __init__(self,wdw,N): "a Koch curve with N levels" wdw.title('a Koch curve') self.d = 3**N+20 self.n = IntVar() self.sn = Scale(wdw,orient='horizontal',\ from_=0,to=N,tickinterval=1,\ length=self.d,variable=self.n,\ command=self.DrawCurve) self.sn.set(0) self.sn.grid(row=0,column=0) self.c = Canvas(wdw,width=self.d,\ height=self.d/3,bg ='white') self.c.grid(row=1,column=0) self.b = Button(wdw,text="clear canvas",\ command=self.ClearCanvas) self.b.grid(row=2,column=0) def koch(self,A,B,k): """ a Koch curve from A to B with k levels """ if(k==0): self.c.create_line(A[0],A[1],B[0],B[1],width=2) else: L = ((2*A[0]+B[0])/3.0,(2*A[1]+B[1])/3.0) R = ((A[0]+2*B[0])/3.0,(A[1]+2*B[1])/3.0) M = ((A[0]+B[0])/2.0,(A[1]+B[1])/2.0) s = math.sqrt(3)/6 T = (s*(A[1]-B[1]),s*(B[0]-A[0])) P = (M[0]-T[0],M[1]-T[1]) self.koch(A,L,k-1) self.koch(L,P,k-1) self.koch(P,R,k-1) self.koch(R,B,k-1) def DrawCurve(self,v): "Draws a regular n-gon" n = int(v) A = (10,self.d/3-20) B = (self.d-10,self.d/3-20) self.koch(A,B,n) def ClearCanvas(self): "Clears the entire canvas" self.c.delete(ALL) def main(): top = Tk() show = KochCurve(top,6) top.mainloop() if __name__ == "__main__": main()