Last week, I went to an Institute talk regarding recent discoveries in the universe that has been found using a new type of telescope that is able to act like a satellite.
One of the coolest ideas that I found in that talk was the idea that there are certain “moon” like structures that have a gravitational pull that allows “planets” and asteroids to orbit it. However, because of the different mass of the asteroids/planets, there exist different orbit distances and speeds that they travel at. On top of this, sometimes, there even exists orbits around the asteroids/planets that are orbiting the bigger moon – much like Earth’s moon.
I wanted to replicate this idea and so instead of a game, I wanted to create a moving art piece that basically shows what the speaker was talking about.
The code can be seen below:
Moon moon, moon2;
Orbits orbits, orbits1, orbits3;
void setup() {
size(600, 600);
smooth(8);
background(0);
moon = new Moon(80);
orbits = new Orbits(150, 0.2, 2.5);
orbits1 = new Orbits(400, 0.05, 4);
orbits3 = new Orbits(200, 0.1, 6);
}
void draw() {
//frameRate(1200);
moon.draw();
//moon.stopTurning();
orbits.draw();
orbits1.draw();
orbits3.draw();
}
These are the class tabs:
//class definition of Moon
class Moon{
PVector v1, v2; //attribute of moon
int diameter; //another attribute of moon
Moon(int d){ //this is the constructor
//does nothing over here
diameter =d; //this is a parameter of the constructor
}
void draw(){
fill(0);
rect(0, 0, width, height);
noFill();
strokeWeight (0.3);
stroke (255, 12);
for (int i = 0; i < 7000; i++)
{
float angle1 = random (TWO_PI);
float angle2 = random (TWO_PI);
v1 = new PVector (width/2 + cos (angle1) * diameter, height/2 + sin (angle1) * diameter);
v2 = new PVector (width/2 + cos (angle2) * diameter, height/2 + sin (angle2) * diameter);
line (v1.x, v1.y, v2.x, v2.y);
}
//noLoop();
}
} //end of class definition
class Orbits {
float a, x, y, diax, diay;
float d = 23;
int para;
float speed;
float speed4orbit;
float b;
Orbits(int p, float s4o, float s){
para = p;
speed4orbit = s4o;
speed = s;;
}
void draw (){
// earth
pushMatrix();
translate(width/2, height/2);
fill(255);
ellipse(x, y, d, d);
// moon
pushMatrix();
translate(x, y);
rotate(radians(a));
ellipse(0, d, d/3, d/3);
popMatrix();
// orbit line
stroke(255, 100);
smooth();
noFill();
ellipse(0, 0, diax*2, diay*2);
x = sin(radians(-a)*speed)*diax;
y = cos(radians(a)*speed)*diay;
a += 4;
diax = lerp(diax, para, speed4orbit);
diay = lerp (diay, para, speed4orbit);
popMatrix();
}
}
Here is a screenshot of one of the frames.

One thing I am not happy with, and I can’t seem to figure out, is how not smooth the movements are. I tried to change the frameRate but that didn’t work out.
One new thing that learned for this project was PVectors, which I found out how to use through examples.