# L-7 MCS 275 Wed 30 Jan 2008 : 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()
