Facebook
From CG, 3 Years ago, written in Python.
Embed
Download Paste or View Raw
Hits: 91
  1. from tkinter import*
  2. from tkinter.ttk import*
  3. import random
  4. window=Tk()
  5. window.title('Tree generator')
  6. window.geometry("1250x700")
  7. window.resizable(1,1)
  8. #------------------------------------------------- adjust variables in this section
  9. w=1250  # width of the canvas
  10. h=650   # height of the canvas
  11. trunk_len=50   # trunk height
  12. fruit_rad=4    # fruit radius
  13. trunk_width=3
  14. branch_width=2
  15. range_limit1,range_limit2,range_limit3=250,500,600 # higher numbers make larger trees.
  16. colour1="black" # canvas background colour           range_limit3 must be less then w/2 to fit within the canvas
  17. colour2="white" # trunk colour
  18. colour3="white" # branch colour
  19. colour4="yellow"# fruit colour
  20. #-------------------------------------------------------------------------------------------
  21. frm1=Frame(window)
  22. frm1.pack()
  23. frm2=Frame(window)
  24. frm2.pack()
  25. frm3=Frame(window)
  26. frm3.pack()
  27. canvas = Canvas(frm3, background=colour1, height=h, width=w)
  28. canvas.pack()
  29. ##### point={} is a dictionary with key=(x1,y1), value=(0:direction of the branch to it(1-5),
  30. # 1:branches_from_it(0-3)
  31. # eg at the beginning, point[(l/2,h-trunk_len)]=[3,0]
  32. ##### directions are as follows--> 1-left, 2-left&up, 3-up, 4-right&up, 5-right
  33. ##### intersect={} is a list of middlepoints of all lines. Used to prevent lines intersecting each other.
  34. ##### fresh_point=[] is a list of all generated points that haven't gone through the branch generation loop
  35. # eg at the beginning, fresh_point=[(l/2,h-trunk_len)]
  36. #-------------------------------------------------------------------------------------------
  37. def generate_main(event):
  38.     global fruits, branches, point, intersect, fresh_point
  39.     bttn1.configure(text="Regenerate")
  40.     canvas.delete("all")
  41.     canvas.create_line(w/2,h,w/2,h-trunk_len, fill=colour2, width=trunk_width)
  42.     point={(w/2,h-trunk_len):[3,0]}
  43.     fresh_point=[(w/2,h-trunk_len)]
  44.     intersect=[]
  45.     while len(fresh_point)>0:
  46.         start_point=next(iter(fresh_point))
  47.         x1,y1=start_point[0],start_point[1]
  48.         spread1 =((h-y1)**2+(w/2-x1)**2)**(1/2)
  49.         print(spread1)
  50.         uniformity=round(scl2.get())
  51.         if spread1>=range_limit3:
  52.             fresh_point.remove(start_point)
  53.             continue
  54.         elif spread1>range_limit2:
  55.             tries=random.randint(uniformity+1,uniformity+2)
  56.         elif spread1>range_limit1:
  57.             tries=random.randint(uniformity+2,uniformity+3)
  58.         else:
  59.             tries=random.randint(uniformity,uniformity+1)
  60.         for i in range(tries):
  61.             if spread1>range_limit1:
  62.                 drctn_new=define_direction1(point[(x1,y1)][0])
  63.             else:
  64.                 drctn_new=define_direction2(point[(x1,y1)][0])
  65.             i1,j1=define_point(x1,y1,drctn_new)
  66.             if (i1,j1) in point or ((x1+i1)/2,(y1+j1)/2) in intersect :
  67.                 continue
  68.             point[(i1,j1)]=[drctn_new,0]
  69.             point[start_point][1]=point[start_point][1]+1
  70.             fresh_point.append((i1,j1))
  71.             intersect.append(((x1+i1)/2,(y1+j1)/2))
  72.             canvas.create_line(x1,y1,i1,j1, fill=colour3, width=branch_width)
  73.         fresh_point.remove(start_point)
  74.     if chk.instate(['selected']):
  75.         fruit_grow(event)
  76.     return
  77.  
  78. def define_direction1(drctn):
  79.     a1=random.randint(1,6)
  80.     if drctn==1 :
  81.         if a1<=3:
  82.             drctn_new=1
  83.         else:
  84.             drctn_new=2
  85.     elif drctn==2:
  86.         if a1<=2:
  87.             drctn_new=1
  88.         elif a1 <=4:
  89.             drctn_new=2
  90.         else:
  91.             drctn_new=3
  92.     elif drctn==3:
  93.         if a1<=2:
  94.             drctn_new=2
  95.         elif a1 <=4:
  96.             drctn_new=3
  97.         else:
  98.             drctn_new=4
  99.     elif drctn==4:
  100.         if a1<=2:
  101.             drctn_new=3
  102.         elif a1 <=4:
  103.             drctn_new=4
  104.         else:
  105.             drctn_new=5
  106.     else:
  107.         if a1<=3:
  108.             drctn_new=4
  109.         else:
  110.             drctn_new=5
  111.     return drctn_new
  112.  
  113. def define_direction2(drctn):
  114.     a1=random.randint(1,6)
  115.     if drctn==1 :
  116.         if a1<=5:
  117.             drctn_new=1
  118.         else:
  119.             drctn_new=2
  120.     elif drctn==2:
  121.         if a1==1:
  122.             drctn_new=1
  123.         elif a1 <=5:
  124.             drctn_new=2
  125.         else:
  126.             drctn_new=3
  127.     elif drctn==3:
  128.         if a1==1:
  129.             drctn_new=2
  130.         elif a1 <=5:
  131.             drctn_new=3
  132.         else:
  133.            drctn_new=4
  134.     elif drctn==4:
  135.         if a1==1:
  136.             drctn_new=3
  137.         elif a1 <=5:
  138.             drctn_new=4
  139.         else:
  140.             drctn_new=5
  141.     else:
  142.         if a1<=1:
  143.             drctn_new=4
  144.         else:
  145.             drctn_new=5
  146.     return drctn_new
  147.  
  148. def define_point (x1,y1,drctn_new):
  149.     branch_len=round(scl1.get())
  150.     if drctn_new==1:
  151.         i1,j1=x1-branch_len,y1
  152.     elif drctn_new==2:
  153.         i1,j1=x1-branch_len,y1-branch_len
  154.     elif drctn_new==3:
  155.         i1,j1=x1,y1-branch_len
  156.     elif drctn_new==4:
  157.         i1,j1=x1+branch_len,y1-branch_len
  158.     else :
  159.         i1,j1=x1+branch_len,y1
  160.     return (i1,j1)
  161.  
  162. def fruit_grow(event):
  163.     for key in point.keys():
  164.         if point[key][1]==1:
  165.             continue
  166.         spread2=((h-key[1])**2+(w/2-key[0])**2)**(1/2)
  167.         if random.randint(1,1000)<spread2:
  168.             canvas.create_oval(key[0]-fruit_rad,key[1]-fruit_rad,key[0]+fruit_rad,key[1]+fruit_rad, fill=colour4)
  169.  
  170. bttn1=Button(frm1,text="Generate",)
  171. bttn1.pack(side="left")
  172. bttn1.bind("<Button-1>",generate_main)
  173.  
  174. lbl1=Label (frm1,text="branch length=")
  175. lbl1.pack(side="left")
  176.  
  177. scl1 = Scale(frm1 ,from_=5, to=50, orient="horizontal")
  178. scl1.pack(side="left")
  179. scl1.set(10)
  180.  
  181. lbl2=Label (frm1,text="  uniformity=")
  182. lbl2.pack(side="left")
  183.  
  184. scl2 = Scale(frm1 ,from_=1, to=5, orient="horizontal")
  185. scl2.pack(side="left")
  186. scl2.set(1)
  187.  
  188. chk = Checkbutton(frm1, text="fruits")
  189. chk.pack(side="left")
  190.  
  191. window.mainloop()