Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os, sys
- import traceback
- from math import *
- with open(os.devnull, "w") as f:
- oldstdout=sys.stdout; sys.stdout=f; import pygame; sys.stdout=oldstdout
- from pygame.locals import *
- if sys.platform in ["win32","win64"]: os.environ["SDL_VIDEO_CENTERED"]="1"
- pygame.display.init()
- pygame.font.init()
- screen_size = [1024,768]
- N = 30
- dt = 86400.0 #one day
- au = 149597870700.0
- G = 6.67408e-11
- icon=pygame.Surface((1,1)); icon.set_alpha(0); pygame.display.set_icon(icon)
- pygame.display.set_caption("N-Body Orbit - Ian Mallett - 2019")
- surface = pygame.display.set_mode(screen_size)
- aspect = float(screen_size[0]) / float(screen_size[1])
- bounds_y = [ -1.3*au, 1.3*au ]
- bounds_x = [ aspect*bounds_y[0], aspect*bounds_y[1] ]
- scn_recip_bounds_extents = [ screen_size[0]/(bounds_x[1]-bounds_x[0]), screen_size[1]/(bounds_y[1]-bounds_y[0]) ]
- def rndint(x): return int(round(x))
- def rotate(vec,angle_rad):
- c=cos(angle_rad); s=sin(angle_rad)
- return [ c*vec[0]-s*vec[1], s*vec[0]+c*vec[1] ]
- def pos_to_scn(pos):
- x = rndint( (pos[0]-bounds_x[0]) * scn_recip_bounds_extents[0] )
- y = rndint( (pos[1]-bounds_y[0]) * scn_recip_bounds_extents[1] )
- return (x,screen_size[1]-y)
- class Object(object):
- def __init__(self, mass, pos,vel, radius):
- self.mass = mass
- self.pos = pos
- self.vel = vel
- self.force = [0.0,0.0]
- self.radius = radius
- def draw(self):
- scn = pos_to_scn(self.pos)
- pygame.draw.circle(surface,(255,)*3,scn,self.radius)
- objs = []
- #Sun
- objs.append(Object( 1.98847e30, [0,0],[0,0], 10 )) #6.957e8
- #Earths
- for i in range(N):
- 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))
- pos=rotate(pos,angle_rad); vel=rotate(vel,angle_rad)
- objs.append(Object( 5.9722e24, pos,vel, 3 ))
- def get_input():
- keys_pressed = pygame.key.get_pressed()
- mouse_buttons = pygame.mouse.get_pressed()
- mouse_position = pygame.mouse.get_pos()
- mouse_rel = pygame.mouse.get_rel()
- for event in pygame.event.get():
- if event.type == QUIT: return False
- elif event.type == KEYDOWN:
- if event.key == K_ESCAPE: return False
- return True
- def update():
- for obj in objs:
- obj.force = [0.0,0.0]
- for i in range(0,len(objs),1):
- obj1 = objs[i]
- for j in range(i+1,len(objs),1):
- obj2 = objs[j]
- vec12 = ( obj2.pos[0]-obj1.pos[0], obj2.pos[1]-obj1.pos[1] )
- r2 = vec12[0]*vec12[0] + vec12[1]*vec12[1]
- force_magn = G*obj1.mass*obj2.mass / r2
- sc = force_magn / (r2**0.5)
- force2on1 = ( sc*vec12[0], sc*vec12[1] )
- obj1.force[0]+=force2on1[0]; obj1.force[1]+=force2on1[1]
- obj2.force[0]-=force2on1[0]; obj2.force[1]-=force2on1[1]
- for obj in objs:
- accel = ( obj.force[0]/obj.mass, obj.force[1]/obj.mass )
- obj.vel[0] += accel[0]*dt
- obj.vel[1] += accel[1]*dt
- obj.pos[0] += obj.vel[0]*dt
- obj.pos[1] += obj.vel[1]*dt
- def draw():
- surface.fill((0,0,0))
- for obj in objs: obj.draw()
- pygame.display.flip()
- def main():
- clock = pygame.time.Clock()
- while True:
- if not get_input(): break
- update()
- draw()
- clock.tick(60)
- pygame.quit()
- if __name__ == "__main__":
- try:
- main()
- except:
- traceback.print_exc()
- pygame.quit()
- input()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement