The script below is a simple demonstration of the gravitational law. You can click to set a mass and then click again to create an other mass. At the second mass you can apply a velocity and see the trajectory. The masses are set to numbers I found that worked with pixel as metrics instead of meters.
Whenn the velocity is perpendicular to the gravitational force, the second mass performs uniform circular motion around the first mass.
import math
import pygame
WIDTH, HEIGHT = 1920, 1080
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Simple Orbit Simulation")
FPS = 60
run = True
totalFrames = 0
x1 = 0
y1 = 0
x2 = -100
y2 = -100
u02x = 0
u02y = 0
ballsdrawn = 0
dragging = 0
m2 = 10**15
m1 = 10**22
Fg = 0
G = 6.673*10**-13
r = 0
θ = 0
uy = 0
def renderscreen():
WIN.fill((0, 0, 0))
pygame.draw.circle(WIN, (255, 255, 255), (x1, y1), 15)
pygame.draw.circle(WIN, (255, 255, 255), (x2, y2), 15)
if dragging == 1:
pygame.draw.line(WIN, (255, 255, 255), (x2, y2), (mousepos[0], mousepos[1]))
pygame.draw.circle(WIN, (0, 255, 0), (mousepos[0], mousepos[1]), 5)
pygame.display.update()
def calculatepos():
global u02x
global u02y
global x2
global y2
r = (math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2))*325367 #1 pixel is 520833m if 1920p is solar system size
θ = (math.atan2((y2 - y1), (x2-x1))) * 180 / 3.14
Fg = G*m1*m2/(r**2)
Fgx = -math.cos(math.radians(θ))*Fg
Fgy = -math.sin(math.radians(θ))*Fg
ay = Fgy/m2
ax = Fgx/m2
u02x += ax*2*325367
u02y += ay*2*325367
x2 += u02x
y2 += u02y
print(r, u02x, u02y)
totalFrames = 0
while run:
totalFrames += 1
mousepos = pygame.mouse.get_pos()
totalFrames += 1
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if ballsdrawn == 0:
x1 = event.pos[0]
y1 = event.pos[1]
ballsdrawn += 1
elif ballsdrawn == 1:
x2 = event.pos[0]
y2 = event.pos[1]
ballsdrawn += 1
if dragging == 1:
u02x = (mousepos[0] - x2)/10
u02y = (mousepos[1] -y2)/10
dragging = 0
if ballsdrawn == 2:
dragging = 1
ballsdrawn +=1 #don't activate again
if dragging != 1 and ballsdrawn>1:
calculatepos()
renderscreen()
pygame.time.delay(16) #16 for 60 FPS
pygame.quit()