Solar system simulation
Tags: javascript, canvas
Published: 2019-05-17 02:49:53

# Intro

Learn how to create a simulation of our solar system with realistic planet movement. This educational application teaches you not only science concepts but also important coding concepts such as:

-	How to use objects to store complex data structures
-	How to use trigonometric functions
-	How to create animations using the loop event

# What do you need?

To run the code in this article you don’t need to install anything on your local computer.

Just open the online JavaScript playground from [codeguppy.com/code.html](https://codeguppy.com/code.html) and copy and paste the following code in the integrated editor.

When ready, press the “Play” button to run the code.

![](https://thepracticaldev.s3.amazonaws.com/i/8n3bshdnikfqluut6une.png)


# Source code

```
var sunRadius = 30;
var systemAge = 0;
var dpf = 1; // days per frame

var planets = [
        { name : 'Mercury', r : 6, rev : 87.97 },
        { name : 'Venus', r : 7, rev : 224.7 },
        { name : 'Earth', r : 10, rev : 365.26, color: 'blue' },
        { name : 'Mars', r : 8, rev : 1.88 * 365 },
        { name : 'Jupiter', r : 20, rev : 11.86 * 365 },
        { name : 'Saturn', r : 15, rev : 29.46 * 365 },
        { name : 'Uranus', r : 12, rev : 84.01 * 365 },
        { name : 'Neptune', r : 7, rev : 164.79 * 365 },
        { name : 'Pluto', r : 5, rev : 248.59 * 365 }
    ];

function enter()
{
    background('Stars');
    calculateDistanceFromSun();
}

function loop()
{
    clear();
    
    updateAge();
    updatePlanets();
    drawPlanets();
    
    displayStats();
}

function drawPlanets()
{
    var sunX = width / 2;
    var sunY = height / 2;
    
    fill('yellow');
    circle(sunX, sunY, sunRadius);
    
    for(var i = 0; i < planets.length; i++)
    {
        var p = planets[i];

        // Draw orbit
        noFill();
        stroke(200);
        circle(sunX, sunY, p.sunDist);
        
        var x = sunX + p.sunDist * cos(p.a);
        var y = sunY - p.sunDist * sin(p.a);
        
        // Draw planet
        stroke(255);
        fill(p.color || "white");
        circle(x, y, p.r);

        push();
        noStroke();
        fill(255);
        textAlign(LEFT, CENTER);
        text(p.name, x + p.r + 5, y);
        pop();
    }
}

function updateAge()
{
    systemAge += dpf;
}

function updatePlanets()
{
    for (var o of planets)
    {
        o.a = (systemAge / o.rev) * 360;
    }
}

function calculateDistanceFromSun()
{
    function getPlanetSize()
    {
        var d = 0;
        for(var o of planets)
        {
            d += o.r * 2;
        }
        return d;
    }
    
    function getInterPlanet()
    {
        var planetsSize = getPlanetSize();
        var dp = height / 2 - sunRadius - planetsSize - 10;
        dp  = dp / planets.length;
        
        return dp;
    }
    
    var dp = getInterPlanet();
    planets[0].sunDist = sunRadius + dp + planets[0].r;
    
    for(var i = 1; i < planets.length; i++)
    {
        var p = planets[i-1];
        planets[i].sunDist = p.sunDist + p.r + dp + planets[i].r;
    }
}

function displayStats()
{
    push();
    fill(255);
    noStroke();
    
    text("System age: " + systemAge + " days", 10, 10);
    
    for(var i = 0; i < planets.length; i++)
    {
        var p = planets[i];
        var pYears = systemAge / p.rev;
        text(p.name + ": " + pYears.toFixed(2) + " years", 10, (i+2)*14);
    }
    
    pop();
}

```

# Feedback

If you liked the article, please follow [@codeguppy](https://twitter.com/codeguppy) on Twitter and / or visit [codeguppy.com](https://codeguppy.com) for more tutorials and projects.

Also, if you want to extend this article with detailed instructions explaing how to build the program step by step, please leave feedback in the comments.