1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public boolean percuter(Physique p, Panneau pan) {
System.out.println("Pas de choc");
if(this.rect().intersects(p.rect())) { // Petit test simple pour économiser du temps CPU avant de faire un test plus lourd
/* On regarde pour chacun des deux objets si un de ses sommets est à l'intérieur de l'autre objet */
if(intersection(this.getSommets(), p) || intersection(p.getSommets(), this)) {
double angle, va, vb, ca, sa, va_normale, vb_normale, va_perpendiculaire, vb_perpendiculaire, va2_normale,
vb2_normale, sommeMasse;
// Quelques calculs pour simplifier les plus gros
angle = Math.atan2(this.y-p.y,this.x-p.x);
sommeMasse = this.surface() + p.surface();
ca = Math.cos(angle);
sa = Math.sin(angle);
va = Math.sqrt(this.vx * this.vx + this.vy * this.vy);
vb = Math.sqrt(p.vx * p.vx + p.vy * p.vy);
// Calcul des vitesses normales et perpendiculaires au choc
va_normale = va * Math.cos(-Math.atan2(this.vy, this.vx) + angle);
va_perpendiculaire = va * Math.sin(-Math.atan2(this.vy, this.vx) + angle);
vb_normale = vb * Math.cos(-Math.atan2(p.vy, p.vx) + angle);
vb_perpendiculaire = vb * Math.sin(-Math.atan2(p.vy, p.vx) + angle);
// Conservation de l'énergie
va2_normale = ((this.surface() - p.surface()) / sommeMasse) * va_normale + ((2 * p.surface()) / sommeMasse) * vb_normale;
vb2_normale = ((p.surface() - this.surface()) / sommeMasse) * vb_normale + ((2 * this.surface()) / sommeMasse) * va_normale;
// Nouvelles positions
this.vx = va2_normale * ca - va_perpendiculaire * Math.cos(angle + Math.PI / 2);
this.vy = va2_normale * sa - va_perpendiculaire * Math.sin(angle + Math.PI / 2);
p.vx = vb2_normale * ca - vb_perpendiculaire * Math.cos(angle + Math.PI / 2);
p.vy = vb2_normale * sa - vb_perpendiculaire * Math.sin(angle + Math.PI / 2);
this.x = this.oldX;
this.y = this.oldY;
p.x = p.oldX;
p.y = p.oldY;
return true;
}
}
return false;
} |