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.