behaviors_DeprecatedCollision.js
/**
* A deprecated collision class that does not work.
* @deprecated
*/
class DeprecatedCollision extends NearBehavior {
constructor() {
super();
}
applyBehavior(particle, timeStep, particles) {
this.collide(particle, particles, timeStep);
this.collideCorrection(particle, particles);
}
collide(particle, particles, timeStep) {
for (let circ of particles) {
if (circ != particle) {
let position = particle.pos;
let mass = particle.mass;
let velocity = particle.vel;
let bounciness = particle.bounciness;
let radius = particle.radius;
let c_position = circ.pos;
let c_mass = circ.mass;
let c_velocity = circ.vel;
let c_radius = circ.radius;
let posDiff1 = position.sub(c_position);
if (posDiff1.magSqr() < (radius + c_radius) * (radius + c_radius)) {
posDiff1 = position.sub(c_position);
let posDiffMagSqr = posDiff1.magSqr();
let massConst1 = 2 * c_mass / (mass + c_mass);
let vDiff1 = velocity.sub(c_velocity);
let dot1 = (vDiff1.dot(posDiff1)) / (posDiffMagSqr);
let massConst2 = 2 * mass / (mass + c_mass);
let vDiff2 = c_velocity.sub(velocity);
let posDiff2 = c_position.sub(position);
let dot2 = (vDiff2.dot(posDiff2)) / (posDiffMagSqr);
// a constant 2 is required for some reason, but it wont work if added anywhere else
if (circ.isPivot) {
particle.vel = (velocity.sub(posDiff1.mult(dot1 * 2))).mult(bounciness);
particle.pos = particle.pos.add(posDiff1.mult(dot1 * 2).mult(bounciness * timeStep * 2));
} else {
particle.vel = (velocity.sub(posDiff1.mult(dot1 * massConst1))).mult(bounciness);
particle.pos = particle.pos.add(posDiff1.mult(dot1 * massConst1).mult(bounciness * timeStep * 2));
}
if (particle.isPivot) {
circ.vel = (c_velocity.sub(posDiff2.mult(dot2 * 2))).mult(bounciness);
circ.pos = circ.pos.add(posDiff2.mult(dot2 * 2).mult(bounciness * timeStep));
} else {
circ.vel = (c_velocity.sub(posDiff2.mult(dot2 * massConst2))).mult(bounciness);
circ.pos = circ.pos.add(posDiff2.mult(dot2 * massConst2).mult(bounciness * timeStep));
}
}
}
}
}
collideCorrection(particle, particles) {
for (let circ of particles) {
if (circ != particle) {
let position = particle.pos;
let mass = particle.mass;
let radius = particle.radius;
let c_position = circ.pos;
let c_mass = circ.mass;
let c_radius = circ.radius;
let posDiff1 = position.sub(c_position);
if (posDiff1.magSqr() < (radius + c_radius) * (radius + c_radius)) {
let direction1 = (c_position.sub(position)).normalize();
let overlap = radius + c_radius - posDiff1.mag();
if (circ.isPivot) {
particle.pos = position.sub(direction1.mult(overlap));
} else {
particle.pos = position.sub(direction1.mult(overlap * c_mass / (mass + c_mass)));
}
}
}
}
}
RANGE() {
return null;
}
}