Advertisement
here2share

# tk_star2circle_morph2.py

Feb 8th, 2025
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.94 KB | None | 0 0
  1. # tk_star2circle_morph2.py
  2.  
  3. import tkinter as tk
  4. from math import sin, cos, pi
  5.  
  6. SZ = 600
  7. center_x = center_y = SZ // 2
  8. radius = 280
  9. num_points = 10
  10. vectors = 500
  11. t = 0
  12.  
  13. root = tk.Tk()
  14. root.geometry(f"{SZ}x{SZ}+0+0")
  15. root.title("tk_star2circle_morph.py")
  16. canvas = tk.Canvas(root, width=SZ, height=SZ, bg="blue")
  17. canvas.pack(fill=tk.BOTH, expand=True)
  18.  
  19. def interpolate(percent, start, stop):
  20.     return start + percent * (stop - start)
  21.  
  22. def get_star_shape():
  23.     points = []
  24.     for i in range(num_points):
  25.         angle = i * 2 * pi / num_points - pi / 2
  26.         r = radius if i % 2 == 0 else radius / 2.5
  27.         x = center_x + r * cos(angle)
  28.         y = center_y + r * sin(angle)
  29.         points.append((x, y))
  30.  
  31.     vectors_list = []
  32.     k = vectors // num_points
  33.     p = 1 / k
  34.     for i in range(vectors):
  35.         j = (i * num_points) // vectors
  36.         percent = (i % k) * p
  37.         start = points[j]
  38.         end = points[(j + 1) % num_points]
  39.         x = interpolate(percent, start[0], end[0])
  40.         y = interpolate(percent, start[1], end[1])
  41.         vectors_list.extend((x, y))
  42.  
  43.     return vectors_list
  44.  
  45. circle_points = []
  46. tmp = 2 * pi / vectors
  47. for i in range(vectors):
  48.     angle = i * tmp + pi
  49.     x = center_x + radius * cos(angle)
  50.     y = center_y + radius * sin(angle)
  51.     circle_points.extend((x, y))
  52.  
  53. def plot():
  54.     canvas.create_polygon(obj, outline="yellow", width=2, fill="yellow")
  55.  
  56. star_points = get_star_shape()
  57. obj = star_points[:]
  58. plot()
  59.  
  60. def morph_to_circle(target_points):
  61.     factor = 0.5 * (1 + sin(t))  # Morphing factor between 0 and 1
  62.     vectors_list = []
  63.     for i in range(0, vectors * 2, 2):
  64.         x = interpolate(factor, target_points[i], circle_points[i])
  65.         y = interpolate(factor, target_points[i+1], circle_points[i+1])
  66.         vectors_list.extend((x, y))
  67.     return vectors_list
  68.  
  69. def update_animation():
  70.     global t, obj
  71.     canvas.delete("all")
  72.     obj = morph_to_circle(star_points)
  73.  
  74.     plot()
  75.  
  76.     t += 0.05
  77.     root.after(10, update_animation)
  78.  
  79. update_animation()
  80. root.mainloop()
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement