> show canvas only <


/* 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()