Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # tk_microbes_beta.py
- import tkinter as tk
- from PIL import Image, ImageTk, ImageDraw, ImageChops
- import random
- import math
- CANVAS_W, CANVAS_H = 600, 600
- WORLD_W, WORLD_H = 1200, 1200
- root = tk.Tk()
- root.geometry(f"{CANVAS_W}x{CANVAS_H}+0+0")
- canvas = tk.Canvas(root, width=CANVAS_W, height=CANVAS_H)
- canvas.pack()
- o360 = 358.5 / (510 * 510)
- max_speed = 20.0
- min_speed = 10.0
- speed_adj = {}
- def create_speed_adj(i):
- peak = 255
- return min_speed + (max_speed - min_speed) * (1 - ((i - peak) / peak) ** 2)
- for i in range(510):
- speed_adj[i] = round(create_speed_adj(i), 2)
- def rgb_to_move(r, g, b, speed):
- new_angle = int(((r * 510) + g) * o360)
- new_speed = speed_adj[(b + int(speed)) % 510]
- return new_angle, new_speed
- colors = [
- (255, 255, 0),
- (255, 165, 0),
- (255, 0, 0),
- (0, 255, 0),
- (0, 0, 255)
- ]
- def create_blob(color, size=600):
- blob = Image.new("RGBA", (size, size), (0, 0, 0, 0))
- draw = ImageDraw.Draw(blob)
- center = size // 2
- for r in range(center, 0, -1):
- alpha = int(255 * (1 - (r / center)))
- draw.ellipse(
- [center - r, center - r, center + r, center + r],
- fill=color + (alpha,)
- )
- return blob
- microbe_images = {color: create_blob(color) for color in colors}
- def reset_canvas(event=None):
- global microbes
- microbes = []
- for color in colors:
- base_speed = random.uniform(min_speed, max_speed)
- offset_angle = random.uniform(0, 360)
- for _ in range(5):
- microbes.append([
- random.uniform(0, WORLD_W),
- random.uniform(0, WORLD_H),
- random.uniform(0, 360),
- offset_angle,
- base_speed,
- color
- ])
- root.bind("<space>", reset_canvas)
- reset_canvas(0)
- viewport_x = (WORLD_W - CANVAS_W) // 2
- viewport_y = (WORLD_H - CANVAS_H) // 2
- while True:
- world_image = Image.new("RGBA", (WORLD_W, WORLD_H), (0, 0, 0, 255))
- for idx, microbe in enumerate(microbes):
- x, y, angle, offset_angle, speed, (r, g, b) = microbe
- try:
- r0, g0, b0, a0 = world_image.getpixel((int(x) % WORLD_W, int(y) % WORLD_H))
- if (r0, g0, b0) != (0, 0, 0):
- angle, speed = rgb_to_move(r + r0, g + g0, b + b0, speed)
- except:
- pass
- rad = math.radians(angle)
- x = (x + math.cos(rad) * speed) % WORLD_W
- y = (y + math.sin(rad) * speed) % WORLD_H
- blob = microbe_images[(r, g, b)]
- bx, by = int(x - blob.width // 2), int(y - blob.height // 2)
- temp = Image.new("RGBA", (WORLD_W, WORLD_H))
- temp.paste(blob, (bx, by), blob)
- world_image = ImageChops.lighter(world_image, temp)
- microbes[idx] = [x, y, angle, offset_angle, speed, (r, g, b)]
- cropped = world_image.crop((
- viewport_x,
- viewport_y,
- viewport_x + CANVAS_W,
- viewport_y + CANVAS_H
- ))
- photo = ImageTk.PhotoImage(cropped)
- canvas.create_image(0, 0, image=photo, anchor=tk.NW)
- root.update()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement