Advertisement
Geometrian

Multiple Earths Stability

Jan 27th, 2019
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.49 KB | None | 0 0
  1. import os, sys
  2. import traceback
  3. from math import *
  4.  
  5. with open(os.devnull, "w") as f:
  6.     oldstdout=sys.stdout; sys.stdout=f; import pygame; sys.stdout=oldstdout
  7. from pygame.locals import *
  8.  
  9.  
  10. if sys.platform in ["win32","win64"]: os.environ["SDL_VIDEO_CENTERED"]="1"
  11.  
  12. pygame.display.init()
  13. pygame.font.init()
  14.  
  15.  
  16. screen_size = [1024,768]
  17.  
  18. N = 30
  19. dt = 86400.0 #one day
  20.  
  21. au = 149597870700.0
  22. G = 6.67408e-11
  23.  
  24. icon=pygame.Surface((1,1)); icon.set_alpha(0); pygame.display.set_icon(icon)
  25. pygame.display.set_caption("N-Body Orbit - Ian Mallett - 2019")
  26.  
  27. surface = pygame.display.set_mode(screen_size)
  28.  
  29. aspect = float(screen_size[0]) / float(screen_size[1])
  30. bounds_y = [ -1.3*au, 1.3*au ]
  31. bounds_x = [ aspect*bounds_y[0], aspect*bounds_y[1] ]
  32. scn_recip_bounds_extents = [ screen_size[0]/(bounds_x[1]-bounds_x[0]), screen_size[1]/(bounds_y[1]-bounds_y[0]) ]
  33.  
  34. def rndint(x): return int(round(x))
  35. def rotate(vec,angle_rad):
  36.     c=cos(angle_rad); s=sin(angle_rad)
  37.     return [ c*vec[0]-s*vec[1], s*vec[0]+c*vec[1] ]
  38. def pos_to_scn(pos):
  39.     x = rndint( (pos[0]-bounds_x[0]) * scn_recip_bounds_extents[0] )
  40.     y = rndint( (pos[1]-bounds_y[0]) * scn_recip_bounds_extents[1] )
  41.     return (x,screen_size[1]-y)
  42.    
  43. class Object(object):
  44.     def __init__(self, mass, pos,vel, radius):
  45.         self.mass = mass
  46.        
  47.         self.pos = pos
  48.         self.vel = vel
  49.         self.force = [0.0,0.0]
  50.        
  51.         self.radius = radius
  52.        
  53.     def draw(self):
  54.         scn = pos_to_scn(self.pos)
  55.         pygame.draw.circle(surface,(255,)*3,scn,self.radius)
  56.  
  57. objs = []
  58.  
  59. #Sun
  60. objs.append(Object( 1.98847e30, [0,0],[0,0], 10 )) #6.957e8
  61.  
  62. #Earths
  63. for i in range(N):
  64.     pos=[1.0*au,0.0]; vel=[0.0,(2.0*pi*au)/(86400.0*365.2425)]; angle_rad=radians(360.0*i/float(N))
  65.     pos=rotate(pos,angle_rad); vel=rotate(vel,angle_rad)
  66.     objs.append(Object( 5.9722e24, pos,vel, 3 ))
  67.  
  68. def get_input():
  69.     keys_pressed = pygame.key.get_pressed()
  70.     mouse_buttons = pygame.mouse.get_pressed()
  71.     mouse_position = pygame.mouse.get_pos()
  72.     mouse_rel = pygame.mouse.get_rel()
  73.     for event in pygame.event.get():
  74.         if   event.type == QUIT: return False
  75.         elif event.type == KEYDOWN:
  76.             if   event.key == K_ESCAPE: return False
  77.     return True
  78.  
  79. def update():
  80.     for obj in objs:
  81.         obj.force = [0.0,0.0]
  82.     for i in range(0,len(objs),1):
  83.         obj1 = objs[i]
  84.         for j in range(i+1,len(objs),1):
  85.             obj2 = objs[j]
  86.             vec12 = ( obj2.pos[0]-obj1.pos[0], obj2.pos[1]-obj1.pos[1] )
  87.             r2 = vec12[0]*vec12[0] + vec12[1]*vec12[1]
  88.             force_magn = G*obj1.mass*obj2.mass / r2
  89.             sc = force_magn / (r2**0.5)
  90.             force2on1 = ( sc*vec12[0], sc*vec12[1] )
  91.             obj1.force[0]+=force2on1[0]; obj1.force[1]+=force2on1[1]
  92.             obj2.force[0]-=force2on1[0]; obj2.force[1]-=force2on1[1]
  93.     for obj in objs:
  94.         accel = ( obj.force[0]/obj.mass, obj.force[1]/obj.mass )
  95.         obj.vel[0] += accel[0]*dt
  96.         obj.vel[1] += accel[1]*dt
  97.         obj.pos[0] += obj.vel[0]*dt
  98.         obj.pos[1] += obj.vel[1]*dt
  99.  
  100. def draw():
  101.     surface.fill((0,0,0))
  102.     for obj in objs: obj.draw()
  103.     pygame.display.flip()
  104.  
  105. def main():
  106.     clock = pygame.time.Clock()
  107.     while True:
  108.         if not get_input(): break
  109.         update()
  110.         draw()
  111.         clock.tick(60)
  112.     pygame.quit()
  113.  
  114. if __name__ == "__main__":
  115.     try:
  116.         main()
  117.     except:
  118.         traceback.print_exc()
  119.         pygame.quit()
  120.         input()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement