here2share

# tk_ripple.py

Oct 6th, 2025
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.72 KB | None | 0 0
  1. # tk_ripple.py
  2.  
  3. import tkinter as tk
  4. import math
  5. from PIL import Image, ImageTk
  6.  
  7. WIDTH, HEIGHT = 640, 480
  8. CENTER_X, CENTER_Y = WIDTH // 2, HEIGHT // 2
  9.  
  10. root = tk.Tk()
  11. root.title("tk_ripple.py")
  12. canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="black")
  13. canvas.pack()
  14.  
  15. pil_img = Image.new("RGB", (WIDTH, HEIGHT))
  16. img_label = canvas.create_image(0, 0, anchor=tk.NW)
  17.  
  18. t = 0
  19.  
  20. dist_map = []
  21. angle_map = []
  22. for y in range(HEIGHT):
  23.     dist_row = []
  24.     angle_row = []
  25.     for x in range(WIDTH):
  26.         dx = x - CENTER_X
  27.         dy = y - CENTER_Y
  28.         dist_row.append(math.sqrt(dx*dx + dy*dy))
  29.         angle_row.append(math.atan2(dy, dx))
  30.     dist_map.append(dist_row)
  31.     angle_map.append(angle_row)
  32.  
  33. while True:
  34.     pixel_data = []
  35.    
  36.     cos_t3 = math.cos(t * 0.3)
  37.     sin_t3 = math.sin(t * 0.3)
  38.     sin_t4 = math.sin(t * 0.4)
  39.     cos_t4 = math.cos(t * 0.4)
  40.    
  41.     offset2_x = 100 * cos_t3
  42.     offset2_y = 100 * sin_t3
  43.     offset3_x = 80 * sin_t4
  44.     offset3_y = 80 * cos_t4
  45.    
  46.     for y in range(HEIGHT):
  47.         for x in range(WIDTH):
  48.             dx = x - CENTER_X
  49.             dy = y - CENTER_Y
  50.             dist = dist_map[y][x]
  51.            
  52.             wave1 = math.sin(dist * 0.05 - t * 2)
  53.            
  54.             dx2 = dx - offset2_x
  55.             dy2 = dy - offset2_y
  56.             dist2 = math.sqrt(dx2*dx2 + dy2*dy2)
  57.             wave2 = math.sin(dist2 * 0.07 - t * 1.5)
  58.            
  59.             dx3 = dx + offset3_x
  60.             dy3 = dy + offset3_y
  61.             dist3 = math.sqrt(dx3*dx3 + dy3*dy3)
  62.             wave3 = math.sin(dist3 * 0.06 - t * 1.8)
  63.            
  64.             combined = (wave1 + wave2 * 0.7 + wave3 * 0.5) / 2.2
  65.            
  66.             angle = angle_map[y][x]
  67.             angular = math.sin(angle * 3 + t) * 0.15
  68.             combined += angular
  69.            
  70.             intensity = (combined + 1) / 2
  71.             intensity = max(0, min(1, intensity))
  72.            
  73.             if intensity < 0.3:
  74.                 r = int(intensity * 40)
  75.                 g = int(intensity * 80)
  76.                 b = int(100 + intensity * 100)
  77.             elif intensity < 0.7:
  78.                 t_local = (intensity - 0.3) / 0.4
  79.                 r = int(40 + t_local * 60)
  80.                 g = int(80 + t_local * 140)
  81.                 b = int(150 + t_local * 80)
  82.             else:
  83.                 t_local = (intensity - 0.7) / 0.3
  84.                 r = int(100 + t_local * 155)
  85.                 g = int(220 + t_local * 35)
  86.                 b = int(230 + t_local * 25)
  87.            
  88.             pixel_data.append((r, g, b))
  89.    
  90.     pil_img.putdata(pixel_data)
  91.    
  92.     photo = ImageTk.PhotoImage(pil_img)
  93.     canvas.itemconfig(img_label, image=photo)
  94.    
  95.     t += 0.05
  96.     root.update()
Advertisement
Add Comment
Please, Sign In to add comment