# tk_ripple.py
import tkinter as tk
import math
from PIL import Image, ImageTk
WIDTH, HEIGHT = 640, 480
CENTER_X, CENTER_Y = WIDTH // 2, HEIGHT // 2
root = tk.Tk()
root.title("tk_ripple.py")
canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="black")
canvas.pack()
pil_img = Image.new("RGB", (WIDTH, HEIGHT))
img_label = canvas.create_image(0, 0, anchor=tk.NW)
t = 0
dist_map = []
angle_map = []
for y in range(HEIGHT):
dist_row = []
angle_row = []
for x in range(WIDTH):
dx = x - CENTER_X
dy = y - CENTER_Y
dist_row.append(math.sqrt(dx*dx + dy*dy))
angle_row.append(math.atan2(dy, dx))
dist_map.append(dist_row)
angle_map.append(angle_row)
while True:
pixel_data = []
cos_t3 = math.cos(t * 0.3)
sin_t3 = math.sin(t * 0.3)
sin_t4 = math.sin(t * 0.4)
cos_t4 = math.cos(t * 0.4)
offset2_x = 100 * cos_t3
offset2_y = 100 * sin_t3
offset3_x = 80 * sin_t4
offset3_y = 80 * cos_t4
for y in range(HEIGHT):
for x in range(WIDTH):
dx = x - CENTER_X
dy = y - CENTER_Y
dist = dist_map[y][x]
wave1 = math.sin(dist * 0.05 - t * 2)
dx2 = dx - offset2_x
dy2 = dy - offset2_y
dist2 = math.sqrt(dx2*dx2 + dy2*dy2)
wave2 = math.sin(dist2 * 0.07 - t * 1.5)
dx3 = dx + offset3_x
dy3 = dy + offset3_y
dist3 = math.sqrt(dx3*dx3 + dy3*dy3)
wave3 = math.sin(dist3 * 0.06 - t * 1.8)
combined = (wave1 + wave2 * 0.7 + wave3 * 0.5) / 2.2
angle = angle_map[y][x]
angular = math.sin(angle * 3 + t) * 0.15
combined += angular
intensity = (combined + 1) / 2
intensity = max(0, min(1, intensity))
if intensity < 0.3:
r = int(intensity * 40)
g = int(intensity * 80)
b = int(100 + intensity * 100)
elif intensity < 0.7:
t_local = (intensity - 0.3) / 0.4
r = int(40 + t_local * 60)
g = int(80 + t_local * 140)
b = int(150 + t_local * 80)
else:
t_local = (intensity - 0.7) / 0.3
r = int(100 + t_local * 155)
g = int(220 + t_local * 35)
b = int(230 + t_local * 25)
pixel_data.append((r, g, b))
pil_img.putdata(pixel_data)
photo = ImageTk.PhotoImage(pil_img)
canvas.itemconfig(img_label, image=photo)
t += 0.05
root.update()