// Add attractive force void addAttractiveForce(ParticleManager& foodManager, ParticleManager& snakeManager) { int attractiveCoeff = 50; glm::vec2 attractiveForce = foodManager.getParticlePosition(0) - snakeManager.getParticlePosition(0); float d = glm::length(attractiveForce); attractiveForce = glm::normalize(attractiveForce); // Plus on divise et plus c'est petit : pluattractivecoeff augmente et mois l'attraction est forte au loin snakeManager.addForceToParticle(0, glm::vec2(attractiveForce[0]/(attractiveCoeff*d), attractiveForce[1]/(attractiveCoeff*d))); }
// Add repulsive force void addRepulsiveForce(ParticleManager& repulsiveManager, ParticleManager& snakeManager) { if(repulsiveManager.getCount() > 0) { for(int i = 0; i < snakeManager.getCount(); ++i) { for(int j = 0; j < repulsiveManager.getCount(); ++j) { glm::vec2 repulse = snakeManager.getParticlePosition(i) - repulsiveManager.getParticlePosition(j); float d = glm::length(repulse); repulse = glm::normalize(repulse); int repulsiveCoeff = 40; if(d < 0.2) { // Plus on divise et plus c'est petit : pluattractivecoeff augmente et mois l'attraction est forte au loin snakeManager.addForceToParticle(i, glm::vec2(repulse[0]/(repulsiveCoeff*d), repulse[1]/(repulsiveCoeff*d))); } } } } }
void ConstantForce::apply(ParticleManager& pm) { for(int i = 0; i < pm.getCount(); ++i) { pm.addForceToParticle(i, this->getForce()); } }