/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.Lp3xqB$8K9U/rev.211
*
* authors:
*
* Don Blair
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
ArrayList particles = new ArrayList();
int N=1;
float G=1.;
float maxForce=4;
float maxSpeed=5;
float rocketSpeed=0;
int frozen=0;
void setup()
{
background(255);
size(1000,800);
//add the atlas rocket
Particle p = new Particle();
p.position.x=width/2+200;
p.position.y=height/2;
p.speed.x=1.;
p.radius=6;
p.fillcolor=0;
p.ID=0;
particles.add(p);
//add the earth
p = new Particle();
p.position.x=width/2-200;
p.position.y=height/2-200;
p.ID=1;
p.radius=100;
p.fillcolor=200;
particles.add(p);
//add the moon
p = new Particle();
p.position.x=width/2+150;
p.position.y=height/2+150;
p.ID=2;
p.radius=40;
p.fillcolor=200;
particles.add(p);
frameRate(20);
}
void update() {
for (int i=0; i< particles.size(); i++) {
Particle pi = (Particle) particles.get(i);
PVector resultant = new PVector(0,0);
for (int j=0; j< particles.size(); j++) {
if (j!=i) {
Particle pj = (Particle) particles.get(j);
float r = dist(pi.position.x,pi.position.y,pj.position.x,pj.position.y)+.1; // + .1 to avoid division by zero
float force = pi.radius*pj.radius*G/(r*r);
/*
if (r<pj.radius/2) {
frozen=1;
}
*/
/*
if (force>maxForce) {
force=maxForce;
}
*/
float angle = atan2(pj.position.y - pi.position.y, pj.position.x - pi.position.x);
resultant.add(new PVector(force*cos(angle),force*sin(angle)));
}
}
if (pi.ID==0) {
if (frozen!=1) {
pi.speed.add(resultant);
pi.position.add(pi.speed);
}
}
/*
// periodic boundaries
pi.position.x=mod(pi.position.x,width);
pi.position.y=mod(pi.position.y,height);
*/
/*
if ((pi.position.x>width)||(pi.position.x<0)||(pi.position.y<0)||(pi.position.y>height)) {
pi.speed.x=-pi.speed.x;
pi.speed.y=-pi.speed.y;
}
*/
}
}
void draw() {
//background(100);
for (int i=0;i<particles.size();i++) {
Particle p = (Particle) particles.get(i);
update();
p.display();
}
}
class Particle
{
PVector position = new PVector(width/2,height/2);
PVector speed = new PVector(0,0);
PVector maxSpeed = new PVector(14,14);
float radius = 6;
int ID=0;
int fillcolor=255;
Particle() {
}
void display() {
fill(fillcolor,100);
noStroke();
ellipse(position.x, position.y, radius, radius);
}
}
void mousePressed() {
frozen=1;
Particle p = (Particle) particles.get(0);
p.speed.x=0;
p.speed.y=0;
p.position.x=mouseX;
p.position.y=mouseY;
background(255);
}
void mouseReleased() {
frozen=0;
background(255);
}
void mouseDragged()
{
Particle p = (Particle) particles.get(0);
float discountFactor=.05;
float speedX=mouseX-p.position.x;
float speedY=mouseY-p.position.y;
p.speed.x=discountFactor*speedX;
p.speed.y=discountFactor*speedY;
float speedMag=8;
stroke(0);
//line(p.position.x,p.position.y,mouseX,mouseY);
line(p.position.x,p.position.y,p.position.x+speedMag*p.speed.x,p.position.y+speedMag*p.speed.y);
//background(255);
}
public static float mod(float k, float m) {
k = k % m;
if(k < 0) k+=m;
return(k);
}//mod()