Correction d'une division par zéro dans l'algo de frottement

This commit is contained in:
Mattéo Delabre 2016-03-23 22:30:20 +01:00
parent 7b278a6100
commit fd0b73154f
1 changed files with 21 additions and 15 deletions

View File

@ -1,5 +1,6 @@
#include "object.hpp" #include "object.hpp"
#include "constants.hpp" #include "constants.hpp"
#include <iostream>
Object::Object(float x, float y) : Object::Object(float x, float y) :
acceleration(0, 0), velocity(0, 0), position(x, y), acceleration(0, 0), velocity(0, 0), position(x, y),
@ -132,6 +133,10 @@ void Object::collide(Object& obj) {
sf::Vector2f tangent = rel_velo - dot_normal * normal; sf::Vector2f tangent = rel_velo - dot_normal * normal;
float tangent_length = std::sqrt(tangent.x * tangent.x + tangent.y * tangent.y); float tangent_length = std::sqrt(tangent.x * tangent.x + tangent.y * tangent.y);
// la tangente est nulle : pas de frottement à générer
// on évite ainsi une division par zéro
if (tangent_length != 0) {
tangent /= tangent_length; tangent /= tangent_length;
float magnitude = -(rel_velo.x * tangent.x + rel_velo.y * tangent.y) / float magnitude = -(rel_velo.x * tangent.x + rel_velo.y * tangent.y) /
@ -150,6 +155,7 @@ void Object::collide(Object& obj) {
setVelocity(getVelocity() - getMassInvert() * friction_impulse * tangent); setVelocity(getVelocity() - getMassInvert() * friction_impulse * tangent);
obj.setVelocity(obj.getVelocity() + obj.getMassInvert() * friction_impulse * tangent); obj.setVelocity(obj.getVelocity() + obj.getMassInvert() * friction_impulse * tangent);
}
// correction de la position des objets. En raison de l'imprécision // correction de la position des objets. En raison de l'imprécision
// des flottants sur la machine, les objets peuvent accumuler une // des flottants sur la machine, les objets peuvent accumuler une