From fd0b73154f0cf085681e6956dafe8b260c52409b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Wed, 23 Mar 2016 22:30:20 +0100 Subject: [PATCH] =?UTF-8?q?Correction=20d'une=20division=20par=20z=C3=A9ro?= =?UTF-8?q?=20dans=20l'algo=20de=20frottement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/object.cpp | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/object.cpp b/src/object.cpp index 3220935..7943fec 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1,5 +1,6 @@ #include "object.hpp" #include "constants.hpp" +#include Object::Object(float x, float y) : acceleration(0, 0), velocity(0, 0), position(x, y), @@ -132,25 +133,30 @@ void Object::collide(Object& obj) { sf::Vector2f tangent = rel_velo - dot_normal * normal; float tangent_length = std::sqrt(tangent.x * tangent.x + tangent.y * tangent.y); - tangent /= tangent_length; - float magnitude = -(rel_velo.x * tangent.x + rel_velo.y * tangent.y) / - (getMassInvert() + obj.getMassInvert()); - float static_friction = (getStaticFriction() + obj.getStaticFriction()) / 2.f; - float dynamic_friction = (getDynamicFriction() + obj.getDynamicFriction()) / 2.f; - float friction_impulse; + // 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; - // utilisation de la loi de Coulomb sur les frottements dynamiques/statiques - // cf https://fr.wikipedia.org/wiki/Loi_de_Coulomb_(m%C3%A9canique) - if (std::abs(magnitude) < collision_impulse * static_friction) { - friction_impulse = magnitude; - } else { - friction_impulse = -collision_impulse * dynamic_friction; + float magnitude = -(rel_velo.x * tangent.x + rel_velo.y * tangent.y) / + (getMassInvert() + obj.getMassInvert()); + float static_friction = (getStaticFriction() + obj.getStaticFriction()) / 2.f; + float dynamic_friction = (getDynamicFriction() + obj.getDynamicFriction()) / 2.f; + float friction_impulse; + + // utilisation de la loi de Coulomb sur les frottements dynamiques/statiques + // cf https://fr.wikipedia.org/wiki/Loi_de_Coulomb_(m%C3%A9canique) + if (std::abs(magnitude) < collision_impulse * static_friction) { + friction_impulse = magnitude; + } else { + friction_impulse = -collision_impulse * dynamic_friction; + } + + setVelocity(getVelocity() - getMassInvert() * friction_impulse * tangent); + obj.setVelocity(obj.getVelocity() + obj.getMassInvert() * friction_impulse * tangent); } - setVelocity(getVelocity() - 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 // des flottants sur la machine, les objets peuvent accumuler une // erreur de positionnement qui les fait "plonger" les un dans les autres.