Open In App

Simulate Elliptical Orbit Using Pygame

In this article, we will draw an elliptical orbit at its center in Python using the Pygame module. We will draw two more circles on an elliptical orbit and move them in orbit. This is similar to the earth revolving around the sun but the only difference is that here 2 circles(planets) move in the same orbit ensuring that they will not collapse. The circle at the center can be considered as the sun and the circles in orbit can be considered as earth and artificial earth.

To install Pygame we will use pip. Open the terminal and type the following command:



pip install pygame

Python program to simulate elliptical orbits in Pygame

Step 1: Import Pygame and initialize it.




import pygame
import math
 
# initialize the pygame
pygame.init()

Step 2: Define the width and height of the window and create a game window.






# define width of screen
width = 1000
# define height of screen
height = 600
screen_res = (width, height)
 
pygame.display.set_caption("GFG Elliptical orbit")
screen = pygame.display.set_mode(screen_res)

Step 3: Define colors in RGB format. We will use these colors in our game.




# define colors in RGB format
# These colors will be used in our game
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
cyan = (0, 255, 255)

Step 4: Define the center of the screen, the radius of the ellipse, and the clock. This center will be used to draw a circle at the center which represents Sun. And the radius of the ellipse will be used to calculate the position of the planet with time.




# centers of screen
X_center = width//2
Y_center = height//2
 
# radius of ellipse
# X_ellipse is major radius of ellipsis
X_ellipse = 400
# Y_ellipse is minor radius of ellipsis
Y_ellipse = 225
 
# pygame.time.Clock() will be used further
# in the game loop to control the speed of the planet.
clock = pygame.time.Clock()

Step 5: Defining the code inside the game loop




while True:
    for degree in range(0,360,1):
        # event loop
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
         
        # fill black color on screen
        screen.fill([0,0,0])
         
        # We will find coordinates of 2 planet that
        # will rotate in same ellipse
        # calculate coordinates of planet 1
        # x_planet is x coordinate
        x_planet_1 = int(math.cos
                         (degree * 2 * math.pi/360)
                         * X_ellipse) + X_center
        # y_planet is y coordinate
        y_planet_1 = int(math.sin(degree * 2 *
                                  math.pi/360) *
                         Y_ellipse) + Y_center
 
        # calculate coordinates of planet 2
        # As we want our planets to be opposite to
        # each other so we will maintain a difference of
        # 180 degrees between then
        degree_2 = degree+180
        # degree will be always between 0 and 360
        if degree>180:
            degree_2 = degree-180
             
        # x_planet is x coordinate
        x_planet_2 = int(math.cos(degree_2 * 2 *
                                  math.pi/360) *
                         X_ellipse) + X_center
        # y_planet is y coordinate
        y_planet_2 = int(math.sin(degree_2 *
                                  2 * math.pi/360)
                         * Y_ellipse) + Y_center
 
 
        # draw circle in center of screen
        pygame.draw.circle(surface=screen,
                           color=red,
                           center=[X_center,Y_center],
                           radius=60)
 
        # draw ellipse
        # Coordinate of left topmost point is (100,75)
        # width of ellipse = 2*(major radius of ellipse)
        # height of ellipse = 2*(minor radius of ellipse)
        pygame.draw.ellipse(surface=screen,
                            color=green,
                            rect=[100,75,800,450],
                            width=1)
 
        # draw both planets
        # x_planet_1, y_planet_1, x_planet_2 and
        # y_planet_2 are calculated above
        pygame.draw.circle(surface=screen,
                           color=blue,
                           center=[x_planet_1,y_planet_1],
                           radius=40)
        pygame.draw.circle(surface=screen,
                           color=cyan,
                           center=[x_planet_2,y_planet_2],
                           radius=40)
 
        # Frame Per Second /Refresh Rate
        clock.tick(5)
        # update screen
        pygame.display.flip()

Below is the complete code:




import pygame
import math
 
# initialize the pygame
pygame.init()
# define width of screen
width = 1000
# define height of screen
height = 600
screen_res = (width, height)
 
pygame.display.set_caption("GFG Elliptical orbit")
screen = pygame.display.set_mode(screen_res)
 
# define colors in RGB format
# These colors will be used in our game
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
cyan = (0, 255, 255)
 
# centers of screen
X_center = width//2
Y_center = height//2
 
# radius of ellipse
# X_ellipse is major radius of ellipsis
X_ellipse = 400
# Y_ellipse is minor radius of ellipsis
Y_ellipse = 225
 
# pygame.time.Clock() will be used further
# in the game loop to control
# the speed of the planet.
clock = pygame.time.Clock()
while True:
    for degree in range(0, 360, 1):
        # event loop
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
 
        # fill black color on screen
        screen.fill([0, 0, 0])
 
        # We will find coordinates of 2 planet
        # that will rotate in same ellipse
        # calculate coordinates of planet 1
        # x_planet is x coordinate
        x_planet_1 = int(math.cos(degree * 2 * math.pi/360)
                         * X_ellipse) + X_center
        # y_planet is y coordinate
        y_planet_1 = int(math.sin(degree * 2 * math.pi/360)
                         * Y_ellipse) + Y_center
 
        # calculate coordinates of planet 2
        # As we want our planets to be opposite to
        # each other so we will maintain a difference
        # of 180 degrees between then
        degree_2 = degree+180
        # degree will be always between 0 and 360
        if degree > 180:
            degree_2 = degree-180
 
        # x_planet is x coordinate
        x_planet_2 = int(math.cos(degree_2 * 2 * math.pi/360)
                         * X_ellipse) + X_center
        # y_planet is y coordinate
        y_planet_2 = int(math.sin(degree_2 * 2 * math.pi/360)
                         * Y_ellipse) + Y_center
 
        # draw circle in center of screen
        pygame.draw.circle(surface=screen, color=red, center=[
                           X_center, Y_center], radius=60)
 
        # draw ellipse
        # Coordinate of left topmost point is (100,75)
        # width of ellipse = 2*(major radius of ellipse)
        # height of ellipse = 2*(minor radius of ellipse)
        pygame.draw.ellipse(surface=screen, color=green,
                            rect=[100, 75, 800, 450], width=1)
 
        # draw both planets
        # x_planet_1, y_planet_1, x_planet_2
        # and y_planet_2 are calculated above
        pygame.draw.circle(surface=screen, color=blue, center=[
                           x_planet_1, y_planet_1], radius=40)
        pygame.draw.circle(surface=screen, color=cyan, center=[
                           x_planet_2, y_planet_2], radius=40)
 
        # Frame Per Second /Refresh Rate
        clock.tick(5)
        # update screen
        pygame.display.flip()

Output:

GIF OUTPUT


Article Tags :