here2share

# tk_Gravitational.py

Oct 10th, 2025
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.80 KB | None | 0 0
  1. # tk_Gravitational.py
  2.  
  3. import tkinter as tk
  4. import random
  5. import math
  6.  
  7. root = tk.Tk()
  8. root.title("Gravity")
  9. canvas = tk.Canvas(root, width=600, height=600, bg='black')
  10. canvas.pack()
  11.  
  12. attractor_x = 300
  13. attractor_y = 300
  14. attractor_mass = 20
  15. attractor_r = math.sqrt(attractor_mass) * 2
  16.  
  17. movers = []
  18.  
  19. def init_movers():
  20.     global movers
  21.     movers = []
  22.     for _ in range(12):
  23.         x = random.uniform(50, 100)
  24.         y = random.uniform(50, 100)
  25.         vx = random.uniform(-1, 1)
  26.         vy = random.uniform(-1, 1)
  27.         mass = random.uniform(0.5, 5)
  28.         r = math.sqrt(mass) * 2
  29.         movers.append({'x': x, 'y': y, 'vx': vx, 'vy': vy, 'ax': 0, 'ay': 0, 'mass': mass, 'r': r})
  30.  
  31. def constrain(val, min_val, max_val):
  32.     return max(min_val, min(max_val, val))
  33.  
  34. def attract(mover):
  35.     fx = attractor_x - mover['x']
  36.     fy = attractor_y - mover['y']
  37.     dist_sq = fx*fx + fy*fy
  38.     dist_sq = constrain(dist_sq, 100, 1000)
  39.     G = 5
  40.     strength = G * (attractor_mass * mover['mass']) / dist_sq
  41.     mag = math.sqrt(fx*fx + fy*fy)
  42.     if mag > 0:
  43.         fx = (fx / mag) * strength
  44.         fy = (fy / mag) * strength
  45.     mover['ax'] += fx / mover['mass']
  46.     mover['ay'] += fy / mover['mass']
  47.  
  48. def attract_movers(m1, m2):
  49.     fx = m2['x'] - m1['x']
  50.     fy = m2['y'] - m1['y']
  51.     dist_sq = fx*fx + fy*fy
  52.     if dist_sq < 1:
  53.         return
  54.     dist_sq = constrain(dist_sq, 100, 1000)
  55.     G = 0.5
  56.     strength = G * (m1['mass'] * m2['mass']) / dist_sq
  57.     mag = math.sqrt(fx*fx + fy*fy)
  58.     if mag > 0:
  59.         fx = (fx / mag) * strength
  60.         fy = (fy / mag) * strength
  61.     m1['ax'] += fx / m1['mass']
  62.     m1['ay'] += fy / m1['mass']
  63.  
  64. def update():
  65.     canvas.delete('all')
  66.    
  67.     for mover in movers:
  68.         mover['ax'] = 0
  69.         mover['ay'] = 0
  70.    
  71.     for mover in movers:
  72.         attract(mover)
  73.    
  74.     for i in range(len(movers)):
  75.         for j in range(i+1, len(movers)):
  76.             attract_movers(movers[i], movers[j])
  77.             attract_movers(movers[j], movers[i])
  78.    
  79.     for mover in movers:
  80.         mover['vx'] += mover['ax']
  81.         mover['vy'] += mover['ay']
  82.         mover['x'] += mover['vx']
  83.         mover['y'] += mover['vy']
  84.        
  85.         canvas.create_oval(
  86.             mover['x'] - mover['r'],
  87.             mover['y'] - mover['r'],
  88.             mover['x'] + mover['r'],
  89.             mover['y'] + mover['r'],
  90.             fill='cyan',
  91.             outline=''
  92.         )
  93.    
  94.     canvas.create_oval(
  95.         attractor_x - attractor_r,
  96.         attractor_y - attractor_r,
  97.         attractor_x + attractor_r,
  98.         attractor_y + attractor_r,
  99.         fill='#ff0064',
  100.         outline=''
  101.     )
  102.    
  103.     root.after(10, update)
  104.  
  105. def reset(event):
  106.     init_movers()
  107.  
  108. root.bind('<space>', reset)
  109.  
  110. init_movers()
  111. update()
  112. root.mainloop()
Add Comment
Please, Sign In to add comment