Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
- # tk_Gravitational.py
- import tkinter as tk
- import random
- import math
- root = tk.Tk()
- root.title("Gravity")
- canvas = tk.Canvas(root, width=600, height=600, bg='black')
- canvas.pack()
- attractor_x = 300
- attractor_y = 300
- attractor_mass = 20
- attractor_r = math.sqrt(attractor_mass) * 2
- movers = []
- def init_movers():
- global movers
- movers = []
- for _ in range(12):
- x = random.uniform(50, 100)
- y = random.uniform(50, 100)
- vx = random.uniform(-1, 1)
- vy = random.uniform(-1, 1)
- mass = random.uniform(0.5, 5)
- r = math.sqrt(mass) * 2
- movers.append({'x': x, 'y': y, 'vx': vx, 'vy': vy, 'ax': 0, 'ay': 0, 'mass': mass, 'r': r})
- def constrain(val, min_val, max_val):
- return max(min_val, min(max_val, val))
- def attract(mover):
- fx = attractor_x - mover['x']
- fy = attractor_y - mover['y']
- dist_sq = fx*fx + fy*fy
- dist_sq = constrain(dist_sq, 100, 1000)
- G = 5
- strength = G * (attractor_mass * mover['mass']) / dist_sq
- mag = math.sqrt(fx*fx + fy*fy)
- if mag > 0:
- fx = (fx / mag) * strength
- fy = (fy / mag) * strength
- mover['ax'] += fx / mover['mass']
- mover['ay'] += fy / mover['mass']
- def attract_movers(m1, m2):
- fx = m2['x'] - m1['x']
- fy = m2['y'] - m1['y']
- dist_sq = fx*fx + fy*fy
- if dist_sq < 1:
- return
- dist_sq = constrain(dist_sq, 100, 1000)
- G = 0.5
- strength = G * (m1['mass'] * m2['mass']) / dist_sq
- mag = math.sqrt(fx*fx + fy*fy)
- if mag > 0:
- fx = (fx / mag) * strength
- fy = (fy / mag) * strength
- m1['ax'] += fx / m1['mass']
- m1['ay'] += fy / m1['mass']
- def update():
- canvas.delete('all')
- for mover in movers:
- mover['ax'] = 0
- mover['ay'] = 0
- for mover in movers:
- attract(mover)
- for i in range(len(movers)):
- for j in range(i+1, len(movers)):
- attract_movers(movers[i], movers[j])
- attract_movers(movers[j], movers[i])
- for mover in movers:
- mover['vx'] += mover['ax']
- mover['vy'] += mover['ay']
- mover['x'] += mover['vx']
- mover['y'] += mover['vy']
- canvas.create_oval(
- mover['x'] - mover['r'],
- mover['y'] - mover['r'],
- mover['x'] + mover['r'],
- mover['y'] + mover['r'],
- fill='cyan',
- outline=''
- )
- canvas.create_oval(
- attractor_x - attractor_r,
- attractor_y - attractor_r,
- attractor_x + attractor_r,
- attractor_y + attractor_r,
- fill='#ff0064',
- outline=''
- )
- root.after(10, update)
- def reset(event):
- init_movers()
- root.bind('<space>', reset)
- init_movers()
- update()
- root.mainloop()
Add Comment
Please, Sign In to add comment