> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.SGAE0jk0Ae$/rev.2360
 * 
 * authors: 
 *   tapesofwrath
 *   Thomas Bell

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



float V0 = 30.0;
float theta = 45.0 * PI/180;
float Vx = V0 * cos(theta);
float Vy = -V0 * sin(theta);

float n = 1;
float g = 9.8;
float Ay = g;
float Ax = 0;

float scale = 6;
float dt = .2;
float xStart = 20;
float yStart = 235;
float objectHeight = 20;
float maxY = 250 - objectHeight/2;
float x = 0;
float y = 0;

float xOld, yOld, xPixel, yPixel, VxOld, VyOld, flightTime, dtNew;
ArrayList tracex, tracey;
var hit = false;

void setup(){
  size(600, 300); 
  smooth();
  fill(153);
  ellipse(20, 235, 20, 20);
  ellipse(20, 235, 5, 5);
  line(0, 250, 600, 250);
  frameRate(25);
  background(255);
  tracex = new ArrayList();
  tracey = new ArrayList();
}
 
void draw() {
  background(255);
  ellipse(20, 235, 7.5, 7.5);
  int len = tracex.size();
  for(int i=0; i < len; i++) { 
    ellipse(tracex.get(i), tracey.get(i), 7.5, 7.5);
  }
  line(0, 250, 600, 250);
  
  tracex.add(xPixel);
  tracey.add(yPixel);
    
  xOld = x;
  x = x + Vx * dt + .5 * Ax * dt * dt;
  xPixel = xStart + (scale * x);
    
  yOld = y;
  y = y + Vy * dt + .5 * Ay * dt * dt;
  yPixel = yStart + (scale * y);
    
  VxOld = Vx;
  Vx = Vx + Ax * dt;
  VyOld = Vy;
  Vy = Vy + Ay * dt;
                                
  flightTime = n * dt;
                                
  if(yPixel > maxY) {
    yGround = (maxY - yStart) / scale;
    z = VyOld / Ay;
    dtNew = -z + sqrt((z * z) - 2. * (yOld - yGround) / Ay);
    x = xOld + VxOld * dtNew + .5 * Ax * dtNew * dtNew;
    xPixel = xStart + (scale * x);
    y = yOld + VyOld * dtNew + .5 * Ay * dtNew * dtNew;
    yPixel = yStart + (scale * y);
    Vx = VxOld + Ax * dtNew;
    Vy = VyOld + Ay * dtNew;
    flightTime = (n - 1) * dt + dtNew;
    noLoop();
    hit = true;
  }
        
  ellipse(xPixel, yPixel, 20, 20);
  text("Flight Time: " + flightTime.toFixed(2) + " s", 15, 30);
  text("Range: " + x.toFixed(1) + " m", 15, 45);  
  n++;
}
void mouseClicked() {
  if(hit) {
    noStroke();  
    fill(255);
    rect(14,48,175,35);
    stroke(0);
    fill(153);
    text("mouseX: " + mouseX, 15, 60);
  } 
}