Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # tk_star2circle_morph2.py
- import tkinter as tk
- from math import sin, cos, pi
- SZ = 600
- center_x = center_y = SZ // 2
- radius = 280
- num_points = 10
- vectors = 500
- t = 0
- root = tk.Tk()
- root.geometry(f"{SZ}x{SZ}+0+0")
- root.title("tk_star2circle_morph.py")
- canvas = tk.Canvas(root, width=SZ, height=SZ, bg="blue")
- canvas.pack(fill=tk.BOTH, expand=True)
- def interpolate(percent, start, stop):
- return start + percent * (stop - start)
- def get_star_shape():
- points = []
- for i in range(num_points):
- angle = i * 2 * pi / num_points - pi / 2
- r = radius if i % 2 == 0 else radius / 2.5
- x = center_x + r * cos(angle)
- y = center_y + r * sin(angle)
- points.append((x, y))
- vectors_list = []
- k = vectors // num_points
- p = 1 / k
- for i in range(vectors):
- j = (i * num_points) // vectors
- percent = (i % k) * p
- start = points[j]
- end = points[(j + 1) % num_points]
- x = interpolate(percent, start[0], end[0])
- y = interpolate(percent, start[1], end[1])
- vectors_list.extend((x, y))
- return vectors_list
- circle_points = []
- tmp = 2 * pi / vectors
- for i in range(vectors):
- angle = i * tmp + pi
- x = center_x + radius * cos(angle)
- y = center_y + radius * sin(angle)
- circle_points.extend((x, y))
- def plot():
- canvas.create_polygon(obj, outline="yellow", width=2, fill="yellow")
- star_points = get_star_shape()
- obj = star_points[:]
- plot()
- def morph_to_circle(target_points):
- factor = 0.5 * (1 + sin(t)) # Morphing factor between 0 and 1
- vectors_list = []
- for i in range(0, vectors * 2, 2):
- x = interpolate(factor, target_points[i], circle_points[i])
- y = interpolate(factor, target_points[i+1], circle_points[i+1])
- vectors_list.extend((x, y))
- return vectors_list
- def update_animation():
- global t, obj
- canvas.delete("all")
- obj = morph_to_circle(star_points)
- plot()
- t += 0.05
- root.after(10, update_animation)
- update_animation()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement