fractalkitty looking for math? fractalkitty.com

all

abovebelow

#random#trig#vectors#physics#interactive#animation#scrap

myAnglemyEnergyballpaddleunitVectorgravitygravityVectorcollision

let myAngle = 0;
let myEnergy = 0.01;
let ball;
let paddle;
let unitVector;
function setup() {
  createCanvas(400, 240);
  noFill();
  d = width / 10;
  ball = {
    pos: createVector(
      random(-width / 3, width / 3),
      random(-width / 3, width / 3)
    ),
    vel: createVector(random(-1.5, 1.5), random(-1.5, 1.5)),
    diam: 10
  };
  paddle = {
    p1: createVector(0, 0),
    p2: createVector(0, 0),
    mid: createVector(0, 0)
  };
}

function draw() {
  let gravity = 1;
  if(keyIsPressed && keyCode===32){
    gravity = 5;
  }
  let gravityVector = p5.Vector.normalize(ball.pos).mult(-random(0.01, 0.1) * gravity);
  ball.pos.add(ball.vel);
  ball.vel.add(gravityVector);
  deltaAngle = Math.atan(2) / 2;
  translate(width / 2, height / 2);//origin in the middle
  background(180, 180, 180);
  noFill();

  paddle.p1 = createVector(
    d * cos(myAngle + deltaAngle),
    d * sin(myAngle + deltaAngle)
  );
  paddle.p2 = createVector(
    d * cos(myAngle - deltaAngle),
    d * sin(myAngle - deltaAngle)
  );

  paddle.mid = createVector(d * cos(myAngle) * 0.85, d * sin(myAngle) * 0.85);
  circle(0, 0, 5);
  line(0, 0, paddle.mid.x, paddle.mid.y);
  line(paddle.p1.x, paddle.p1.y, paddle.p2.x, paddle.p2.y);
  fill(60);

  circle(ball.pos.x, ball.pos.y, ball.diam);
  collision();
}

function mouseWheel(event) {
  myAngle += event.delta / 40;
  paddle.angVel = event.delta / 40;
}

function collision() {
  x1 = paddle.p1.x - ball.pos.x;
  y1 = paddle.p1.y - ball.pos.y;
  x2 = paddle.p2.x - ball.pos.x;
  y2 = paddle.p2.y - ball.pos.y;
  dx = x2 - x1;
  dy = y2 - y1;
  dr = sqrt(dx * dx + dy * dy);
  D = x1 * y2 - x2 * y1;//dot 
  r = ball.diam / 2;
  delta = r * r * dr * dr - D * D;
  xcond = (0 >= x1 && 0 <= x2) || (0 >= x2 && 0 <= x1);
  ycond = (0 >= y1 && 0 <= y2) || (0 >= y2 && 0 <= y1);
  if (delta >= 0 && xcond) {
    normx = -dy / dr;
    normy = dx / dr;
    dotMe = ball.vel.x * normx + ball.vel.y * normy;
    ball.vel.x = ball.vel.x - 2 * dotMe * normx;
    ball.vel.y = ball.vel.y - 2 * dotMe * normy;
  } else {
  }
  if (ball.pos.x >= width / 2 - ball.diam) {
    ball.vel.x = ball.vel.x * -1;
    ball.pos.x = width / 2 - ball.diam - 1;
  }
  if (ball.pos.x <= -width / 2 + ball.diam) {
    ball.vel.x = ball.vel.x * -1;
    ball.pos.x = -width / 2 + ball.diam + 1;
  }
  if (ball.pos.y >= height / 2 - ball.diam) {
    ball.vel.y = ball.vel.y * -1;
    ball.pos.y = height / 2 - ball.diam - 1;
  }
  if (ball.pos.y <= -height / 2 + ball.diam) {
    ball.vel.y = ball.vel.y * -1;
    ball.pos.y = -height / 2 + ball.diam + 1;
  }
}