Force d'attraction pour tous
This commit is contained in:
parent
20d15c6df8
commit
4b606cc1da
33
src/ball.cpp
33
src/ball.cpp
|
@ -20,39 +20,6 @@ sf::Vector2f Ball::getForces(EngineState& state) {
|
||||||
forces += sf::Vector2f(Constants::MOVE, 0);
|
forces += sf::Vector2f(Constants::MOVE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// force d'attraction entre les balles et les blocs chargés
|
|
||||||
if (getCharge() != 0) {
|
|
||||||
for (unsigned int j = 0; j < state.objects.size(); j++) {
|
|
||||||
Object *attractive = state.objects[j];
|
|
||||||
|
|
||||||
if (attractive == this || attractive->getCharge() == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// vecteur allant de l'objet attirant vers l'objet considéré
|
|
||||||
sf::Vector2f attraction(getPosition() - attractive->getPosition());
|
|
||||||
|
|
||||||
// la norme de ce vecteur est la distance entre les objets
|
|
||||||
float distanceSquared = attraction.x * attraction.x +
|
|
||||||
attraction.y * attraction.y;
|
|
||||||
|
|
||||||
// éviter la division par zéro
|
|
||||||
if (distanceSquared == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// normalisation du vecteur direction qui porte
|
|
||||||
// la force d'attraction, puis application de la norme
|
|
||||||
attraction /= std::sqrt(distanceSquared);
|
|
||||||
attraction *= Constants::ATTRACTION * (
|
|
||||||
(getCharge() * attractive->getCharge()) /
|
|
||||||
distanceSquared
|
|
||||||
);
|
|
||||||
|
|
||||||
forces += attraction;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return forces;
|
return forces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,39 @@ sf::Vector2f Object::getForces(EngineState& state) {
|
||||||
// force de gravité
|
// force de gravité
|
||||||
forces += sf::Vector2f(0, Constants::GRAVITY);
|
forces += sf::Vector2f(0, Constants::GRAVITY);
|
||||||
|
|
||||||
|
// force d'attraction entre objets chargés
|
||||||
|
if (getCharge() != 0) {
|
||||||
|
for (unsigned int j = 0; j < state.objects.size(); j++) {
|
||||||
|
Object *attractive = state.objects[j];
|
||||||
|
|
||||||
|
if (attractive == this || attractive->getCharge() == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// vecteur allant de l'objet attracteur vers l'objet actuel
|
||||||
|
sf::Vector2f attraction(getPosition() - attractive->getPosition());
|
||||||
|
|
||||||
|
// la norme de ce vecteur est la distance entre les objets
|
||||||
|
float distanceSquared = attraction.x * attraction.x +
|
||||||
|
attraction.y * attraction.y;
|
||||||
|
|
||||||
|
// éviter la division par zéro
|
||||||
|
if (distanceSquared == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalisation du vecteur direction qui porte
|
||||||
|
// la force d'attraction, puis application de la norme
|
||||||
|
attraction /= std::sqrt(distanceSquared);
|
||||||
|
attraction *= Constants::ATTRACTION * (
|
||||||
|
(getCharge() * attractive->getCharge()) /
|
||||||
|
distanceSquared
|
||||||
|
);
|
||||||
|
|
||||||
|
forces += attraction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return forces;
|
return forces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue