# tk_spring_loaded.py import tkinter as tk import math import time # Setup WIDTH, HEIGHT = 640, 480 CENTER_X, CENTER_Y = WIDTH // 2, HEIGHT // 2 canvas_scale = 100 num_points = 200 fov = 3.0 root = tk.Tk() root.title("tk_spring_loaded.py") canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="black") canvas.pack() # Generate 3D points in a spiral points = [] for i in range(num_points): a = i * 0.3 x = math.cos(a) * (1 + i * 0.01) y = math.sin(a) * (1 + i * 0.01) z = i * 0.05 points.append((x, y, z)) def project(x, y, z, t): # Rotate around Y axis angle = t * 0.5 cos_a = math.cos(angle) sin_a = math.sin(angle) xz = x * cos_a - z * sin_a zz = x * sin_a + z * cos_a # Rotate around X axis angle2 = t * 0.3 cos_b = math.cos(angle2) sin_b = math.sin(angle2) yz = y * cos_b - zz * sin_b zz = y * sin_b + zz * cos_b # Perspective projection scale = canvas_scale / (zz + fov) px = CENTER_X + xz * scale py = CENTER_Y + yz * scale return px, py, zz def animate(): canvas.delete("all") t = time.time() for i, (x, y, z) in enumerate(points): px, py, depth = project(x, y, z, t) # Color based on depth and time r = int(128 + 127 * math.sin(t + depth)) g = int(128 + 127 * math.sin(t + depth + 2)) b = int(128 + 127 * math.sin(t + depth + 4)) color = f'#{r:02x}{g:02x}{b:02x}' size = max(1, int(6 - depth)) canvas.create_oval(px - size, py - size, px + size, py + size, fill=color, outline="") root.after(1, animate) animate() root.mainloop()