Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # tk_lg_gradient_sq_spiral.py
- from PIL import Image, ImageTk
- import tkinter as tk
- WW, HH = 640, 640
- size = 16
- root = tk.Tk()
- canvas = tk.Canvas(root, width=WW, height=HH)
- root.geometry(f"{WW}x{HH}+10+10")
- canvas.pack()
- cache = []
- def create_outward_spiral_matrix(size):
- matrix = {(i, j): -1 for i in range(size) for j in range(size)}
- directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # right, down, left, up
- dir_idx = 0
- x, y = size // 2 - 1, size // 2 - 1 # Start at center for even size
- num_steps = 1
- n = 0
- if matrix.get((x, y), -1) == -1:
- matrix[(x, y)] = n
- n += 1
- while True:
- for _ in range(2): # Two directions per layer
- dx, dy = directions[dir_idx]
- steps_completed = 0
- for _ in range(num_steps):
- x += dx
- y += dy
- if x < 0 or x >= size or y < 0 or y >= size or matrix.get((x, y), -1) != -1:
- return matrix
- matrix[(x, y)] = n
- n += 1
- steps_completed += 1
- dir_idx = (dir_idx + 1) % 4
- if steps_completed < num_steps:
- return matrix
- num_steps += 1
- matrix = create_outward_spiral_matrix(size)
- steps = [2, 4, 8, 16]
- for i in range(len(steps) - 1):
- current_s = steps[i]
- next_s = steps[i + 1]
- current_center_start = 8 - current_s // 2
- current_coords = [(x, y) for x in range(current_center_start, current_center_start + current_s)
- for y in range(current_center_start, current_center_start + current_s)]
- current_colors = {}
- for x, y in current_coords:
- rel_x = x - current_center_start
- rel_y = y - current_center_start
- current_colors[(rel_x, rel_y)] = matrix[(x, y)]
- next_center_start = 8 - next_s // 2
- next_coords = [(x, y) for x in range(next_center_start, next_center_start + next_s)
- for y in range(next_center_start, next_center_start + next_s)]
- next_colors_rel = {}
- for x, y in next_coords:
- rel_x = x - next_center_start
- rel_y = y - next_center_start
- next_colors_rel[(rel_x, rel_y)] = matrix.get((x, y), -1)
- cache_entry = {}
- for rel_pos, color in current_colors.items():
- positions = [pos for pos, c in next_colors_rel.items() if c == color]
- if positions:
- cache_entry[color] = positions
- cache.append(cache_entry)
- current_step = 0
- images = []
- for s in steps:
- center_start = 8 - s // 2
- img = Image.new("L", (s, s))
- for x in range(s):
- for y in range(s):
- img.putpixel((x, y), matrix[(center_start + x, center_start + y)])
- images.append(img.resize((WW, HH), Image.NEAREST))
- tk_images = [ImageTk.PhotoImage(img) for img in images]
- def next_image(event=None):
- global current_step
- if current_step < len(images):
- canvas.create_image(0, 0, anchor=tk.NW, image=tk_images[current_step])
- current_step += 1
- root.after(1000, next_image)
- else:
- current_step = 0
- root.after(1000, next_image)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement