Advertisement
here2share

# tk_microbes_beta.py

May 9th, 2025
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.11 KB | None | 0 0
  1. # tk_microbes_beta.py
  2.  
  3. import tkinter as tk
  4. from PIL import Image, ImageTk, ImageDraw, ImageChops
  5. import random
  6. import math
  7.  
  8. CANVAS_W, CANVAS_H = 600, 600
  9. WORLD_W, WORLD_H = 1200, 1200
  10.  
  11. root = tk.Tk()
  12. root.geometry(f"{CANVAS_W}x{CANVAS_H}+0+0")
  13. canvas = tk.Canvas(root, width=CANVAS_W, height=CANVAS_H)
  14. canvas.pack()
  15.  
  16. o360 = 358.5 / (510 * 510)
  17. max_speed = 20.0
  18. min_speed = 10.0
  19.  
  20. speed_adj = {}
  21. def create_speed_adj(i):
  22.     peak = 255
  23.     return min_speed + (max_speed - min_speed) * (1 - ((i - peak) / peak) ** 2)
  24.  
  25. for i in range(510):
  26.     speed_adj[i] = round(create_speed_adj(i), 2)
  27.  
  28. def rgb_to_move(r, g, b, speed):
  29.     new_angle = int(((r * 510) + g) * o360)
  30.     new_speed = speed_adj[(b + int(speed)) % 510]
  31.     return new_angle, new_speed
  32.  
  33. colors = [
  34.     (255, 255, 0),
  35.     (255, 165, 0),
  36.     (255, 0, 0),
  37.     (0, 255, 0),
  38.     (0, 0, 255)
  39. ]
  40.  
  41. def create_blob(color, size=600):
  42.     blob = Image.new("RGBA", (size, size), (0, 0, 0, 0))
  43.     draw = ImageDraw.Draw(blob)
  44.     center = size // 2
  45.     for r in range(center, 0, -1):
  46.         alpha = int(255 * (1 - (r / center)))
  47.         draw.ellipse(
  48.             [center - r, center - r, center + r, center + r],
  49.             fill=color + (alpha,)
  50.         )
  51.     return blob
  52.  
  53. microbe_images = {color: create_blob(color) for color in colors}
  54.  
  55. def reset_canvas(event=None):
  56.     global microbes
  57.     microbes = []
  58.     for color in colors:
  59.         base_speed = random.uniform(min_speed, max_speed)
  60.         offset_angle = random.uniform(0, 360)
  61.         for _ in range(5):
  62.             microbes.append([
  63.                 random.uniform(0, WORLD_W),
  64.                 random.uniform(0, WORLD_H),
  65.                 random.uniform(0, 360),
  66.                 offset_angle,
  67.                 base_speed,
  68.                 color
  69.             ])
  70.  
  71. root.bind("<space>", reset_canvas)
  72. reset_canvas(0)
  73.  
  74. viewport_x = (WORLD_W - CANVAS_W) // 2
  75. viewport_y = (WORLD_H - CANVAS_H) // 2
  76.  
  77. while True:
  78.     world_image = Image.new("RGBA", (WORLD_W, WORLD_H), (0, 0, 0, 255))
  79.  
  80.     for idx, microbe in enumerate(microbes):
  81.         x, y, angle, offset_angle, speed, (r, g, b) = microbe
  82.  
  83.         try:
  84.             r0, g0, b0, a0 = world_image.getpixel((int(x) % WORLD_W, int(y) % WORLD_H))
  85.             if (r0, g0, b0) != (0, 0, 0):
  86.                 angle, speed = rgb_to_move(r + r0, g + g0, b + b0, speed)
  87.         except:
  88.             pass
  89.  
  90.         rad = math.radians(angle)
  91.         x = (x + math.cos(rad) * speed) % WORLD_W
  92.         y = (y + math.sin(rad) * speed) % WORLD_H
  93.  
  94.         blob = microbe_images[(r, g, b)]
  95.         bx, by = int(x - blob.width // 2), int(y - blob.height // 2)
  96.  
  97.         temp = Image.new("RGBA", (WORLD_W, WORLD_H))
  98.         temp.paste(blob, (bx, by), blob)
  99.         world_image = ImageChops.lighter(world_image, temp)
  100.  
  101.         microbes[idx] = [x, y, angle, offset_angle, speed, (r, g, b)]
  102.  
  103.     cropped = world_image.crop((
  104.         viewport_x,
  105.         viewport_y,
  106.         viewport_x + CANVAS_W,
  107.         viewport_y + CANVAS_H
  108.     ))
  109.  
  110.     photo = ImageTk.PhotoImage(cropped)
  111.     canvas.create_image(0, 0, image=photo, anchor=tk.NW)
  112.     root.update()
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement