Advertisement
here2share

# tk_flood_zoom_step50.py

Mar 14th, 2025
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.19 KB | None | 0 0
  1. # tk_flood_zoom_step50.py
  2.  
  3. import tkinter as tk
  4. from PIL import Image, ImageTk
  5. import math
  6.  
  7. WW, HH = 640, 640
  8. CX, CY = WW // 2, HH // 2
  9.  
  10. root = tk.Tk()
  11. root.title("# tk_flood_zoom.py")
  12. canvas = tk.Canvas(root, width=WW, height=HH)
  13. root.geometry("+10+10")
  14. canvas.pack()
  15.  
  16. img = Image.new('RGB', (WW, HH), "white")
  17.  
  18. rgb_list = {}
  19. rgb_list_max = {}
  20. step = 50
  21. max_value = 1000
  22. for r in range(0, 256, step):
  23.     for g in range(0, 256, step):
  24.         for b in range(0, 256, step):
  25.             rgb_list[(r, g, b)] = max_value
  26. Lrgb = len(rgb_list)
  27. rgb_list_max = rgb_list.copy()
  28. rgb_cue = list(rgb_list)
  29.  
  30. cXY = []
  31. inner = {}
  32. for j in range(HH):
  33.     for i in range(WW):
  34.         distance = ((CX - i) ** 2 + (CY - j) ** 2) ** 0.5
  35.         xy2 = math.atan2(i - CX, j - CY)
  36.         if distance < 50:
  37.             cXY.append(((int(distance), xy2), i, j))
  38.  
  39. for j in (CY-1, CY, CY+1):
  40.     for i in (CX-1, CX, CX+1):
  41.         inner[(i, j)] = 0
  42.                
  43. def idx_base(idx, length, base=Lrgb):
  44.     result = []
  45.     for pos in range(length):
  46.         divisor = base ** (length - pos - 1)
  47.         digit = (idx // divisor) % base
  48.         result.append(digit)
  49.     return result
  50.  
  51. cXY.sort()
  52. cXY = [(x, y) for z, x, y in cXY]
  53. LXY = len(cXY)
  54.  
  55. def call_rgb(rgb):
  56.     rgb = tuple([(value + 10) // step * step for value in rgb])
  57.     return rgb_list[rgb], rgb
  58.  
  59. quad = []
  60. def plot(i):
  61.     global quad
  62.     for j in range(i, LXY, n * 2):
  63.         x, y = cXY[j]
  64.         if (x, y) in inner:
  65.             if not quad:
  66.                 quad = [rgb_cue[(i + q) % Lrgb] for i in idx_base(q, 9)]
  67.             rgb = quad.pop()
  68.         else:
  69.             neighbors = [img.getpixel((x + x0, y + y0)) for x0 in (-1, 1) for y0 in (-1, 1)]
  70.             value, rgb = min([call_rgb(rgb) for rgb in neighbors])
  71.             if value > 0:
  72.                 value = value - 1
  73.             else:
  74.                 rgb_list_max[rgb] += 5
  75.                 value = rgb_list_max[rgb]
  76.            
  77.             rgb_list[rgb] = value
  78.            
  79.         img.putpixel((x, y), rgb)
  80.  
  81. scale = 32
  82. n = 16
  83. oXY = [i if i % 2 else n * 2 - i - 2 for i in range(n * 2)]
  84. q = 0
  85. while True:
  86.     for i in oXY:
  87.         canvas.delete('all')
  88.         img = img.crop((scale, scale, WW - scale, HH - scale))
  89.         img = img.resize((WW, HH), Image.ANTIALIAS)
  90.         photo = ImageTk.PhotoImage(img)
  91.         canvas.create_image(0, 0, image=photo, anchor=tk.NW)
  92.         root.update()
  93.  
  94.         plot(i)
  95.         q = (q + 29)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement