Hi there! I am trying to make two balls bounce once they hit each other, but for some reason, they are being thrown away insanely fast! My calculations are based on linear momentum conservation and a fixed coefficient of restitution.
Here is my sample:
Ball[] balls = new Ball[2];
float gravity = 0.1;
float sz;
void setup() {
size(400, 400);
// Initialize ball index 0
balls[0] = new Ball(width/2 + 15, height/2, 0.04*height, 0, 0);
balls[1] = new Ball(width/2, height/3, 0.03*height, 0, 0);
}
void draw() {
background(100);
// Update and display all balls
balls[0].checkCollision(balls[1]);
for (int i = 0; i < balls.length; i++) {
balls[i].gravity();
balls[i].move();
balls[i].display();
}
}
class Ball {
PVector pos;
PVector speed;
float w;
float m;
Ball(float tempX, float tempY, float tempW, float xSpeed, float ySpeed) {
pos = new PVector(tempX, tempY);
w = tempW;
speed = new PVector(xSpeed, ySpeed);
m = w*w*.1;
}
void gravity() {
// Add gravity to speed
speed.y += gravity;
}
void move() {
// Add speed to y location
pos.add(speed);
// If square reaches the bottom or the side
// Reverse speed
if (pos.y > height - w) {
speed.y *= -0.95;
pos.y = height - w;
}
if (pos.x < w) {
speed.x *= -0.95;
pos.x = w;
}
if (pos.x > height - w) {
speed.x *= -0.95;
pos.x = height - w;
}
if (pos.y < w) {
speed.y *= -0.95;
pos.y = w;
}
}
void display() {
// Display the circle
fill(255);
noStroke();
ellipse(pos.x, pos.y, 2*w, 2*w);
}
void checkCollision(Ball other) {
if (PVector.dist(pos, other.pos) < w + other.w) {
float d = w + other.w - PVector.dist(pos, other.pos);
PVector dist = PVector.sub(other.pos.copy(), pos.copy());
PVector v_1 = dist.copy().setMag(PVector.dot(dist, speed));
PVector v_2 = dist.copy().setMag(PVector.dot(dist.mult(-1), other.speed));
speed.sub(v_1);
other.speed.sub(v_2);
pos.add(dist.copy().mult(-1).setMag(d/2));
other.pos.add(dist.copy().setMag(d/2));
float e = 1;
PVector v_3 = PVector.div(PVector.add(PVector.mult(v_1.copy(), m - e * other.m), PVector.mult(v_2.copy(), other.m * (e + 1))), m + other.m);
PVector v_4 = PVector.div(PVector.add(PVector.mult(v_1.copy(), m * (e + 1)), PVector.mult(v_2.copy(), other.m - e * m)), m + other.m);
speed.add(v_3);
other.speed.add(v_4);
}
}
}
The problem is on the fuction “checkCollision” on the 70th line. I will still work on this code for a while, but I am not finding the cause of the supersonic repulsion of the balls.
Thanks for your attention .