Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # tk_vector_field.py
- import math, random, tkinter as tk
- WIDTH, HEIGHT = 1200, 600
- MARGIN = 40
- NUM_LON = WIDTH // MARGIN
- NUM_LAT = HEIGHT // MARGIN
- DELAY = 10
- LENGTH = MARGIN * 0.7
- focus = []
- for _ in range(20):
- theta = random.uniform(0, 2*math.pi)
- speed = random.uniform(0.5, 3.0)
- vx = math.cos(theta) * speed
- vy = math.sin(theta) * speed
- focus.append({
- "x": random.randint(0, WIDTH),
- "y": random.randint(0, HEIGHT),
- "vx": vx,
- "vy": vy,
- "theta": theta
- })
- MAX_SPEED = 10
- ACCEL = 0.5
- def lon_to_x(lon): return MARGIN + (lon + 180) * (WIDTH - 2*MARGIN) / 360
- def lat_to_y(lat): return HEIGHT - MARGIN - (lat + 90) * (HEIGHT - 2*MARGIN) / 180
- def magnitude_color(mag):
- r = int(255 * mag); b = int(255 * (1-mag)); g = 40
- return f"#{r:02x}{g:02x}{b:02x}"
- def update_focus():
- for f in focus:
- f["theta"] += random.uniform(-0.1, 0.1)
- ax = math.cos(f["theta"]) * ACCEL + random.uniform(-0.1, 0.1)
- ay = math.sin(f["theta"]) * ACCEL + random.uniform(-0.1, 0.1)
- f["vx"] += ax; f["vy"] += ay
- speed = math.sqrt(f["vx"]**2 + f["vy"]**2)
- if speed > MAX_SPEED:
- f["vx"] = f["vx"] / speed * MAX_SPEED
- f["vy"] = f["vy"] / speed * MAX_SPEED
- f["x"] += f["vx"]; f["y"] += f["vy"]
- if f["x"] < 0: f["x"] += WIDTH
- if f["x"] >= WIDTH: f["x"] -= WIDTH
- if f["y"] < 0: f["y"] += HEIGHT
- if f["y"] >= HEIGHT: f["y"] -= HEIGHT
- def animate_field():
- update_focus()
- for j in range(NUM_LAT):
- lat = -90 + j*(180/(NUM_LAT-1))
- py = lat_to_y(lat)
- for i in range(NUM_LON):
- lon = -180 + i*(360/(NUM_LON-1))
- px = lon_to_x(lon)
- u = v = 0
- for f in focus:
- dx = (f["x"] - px + WIDTH/2) % WIDTH - WIDTH/2
- dy = (f["y"] - py + HEIGHT/2) % HEIGHT - HEIGHT/2
- dist = math.sqrt(dx*dx + dy*dy) + 1e-6
- u += dx / (dist**2)
- v += dy / (dist**2)
- mag = math.sqrt(u*u + v*v)
- if mag > 0:
- u /= mag
- v /= mag
- dx = LENGTH * u
- dy = -LENGTH * v
- x2, y2 = px + dx, py + dy
- color = magnitude_color(min(1.0, mag/5.0))
- c.coords(arrows[j][i], x2, y2, px, py)
- c.itemconfig(arrows[j][i], fill=color)
- c.after(DELAY, animate_field)
- root = tk.Tk()
- root.title("# tk_vector_field.py")
- root.geometry('+0+0')
- c = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="white")
- c.pack()
- arrows = [[c.create_line(0,0,0,0,arrow=tk.LAST,width=2) for i in range(NUM_LON)] for j in range(NUM_LAT)]
- animate_field()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment