1
Général / [Résolu]Problème de collisions
« le: Août 19, 2016, 05:27:26 pm »
Bonjour tout le monde,
Je viens d'implémenter une fonction pour gérer les collisions entre deux formes convexes. Après deux heures de relecture, je ne parviens toujours pas à trouver le problème, pourtant je suis certain que ça ne tient pas à grand chose.
La fonction suivante renvoie systématiquement 'false'.
Je vous remercie d'avance pour vos suggestions!
Je viens d'implémenter une fonction pour gérer les collisions entre deux formes convexes. Après deux heures de relecture, je ne parviens toujours pas à trouver le problème, pourtant je suis certain que ça ne tient pas à grand chose.
La fonction suivante renvoie systématiquement 'false'.
bool shapesCollideCustom(const sf::ConvexShape & first, const sf::ConvexShape & second)
{
//https://openclassrooms.com/courses/theorie-des-collisions/formes-plus-complexes
//article is in french, but is really helpful
//Way easier and faster than the SAT everyone seem to talk about
const std::size_t pointCount1 = first.getPointCount();
const std::size_t pointCount2 = second.getPointCount();
for (std::size_t i = 0; i < pointCount2; i++)
{
//Vector AB is vector point[i]point[i+1]
//Here we are setting point A and point B
//Point A = tab[i];
sf::Vector2f B;
if (i == pointCount2 - 1) // si c'est le dernier point, on relie au premier
B = second.getTransform().transformPoint(second.getPoint(0));
else // sinon on relie au suivant.
B = second.getTransform().transformPoint(second.getPoint(i + 1));
//vector D = vector AB
const sf::Vector2f D(getVectorTwoPoints(second.getTransform().transformPoint(second.getPoint(i)), B));
//Vector T = vector AP
for (std::size_t j = 0; j < pointCount1; j++)
{
const sf::Vector2f T(getVectorTwoPoints(second.getTransform().transformPoint(second.getPoint(i)), first.getTransform().transformPoint(first.getPoint(j))));
if (D.x*T.y - D.y*T.x < 0)
return false; // un point à droite et on arrête tout.
}
}
return true; // si on sort du for, c'est qu'aucun point n'est à gauche, donc c'est bon.
}
{
//https://openclassrooms.com/courses/theorie-des-collisions/formes-plus-complexes
//article is in french, but is really helpful
//Way easier and faster than the SAT everyone seem to talk about
const std::size_t pointCount1 = first.getPointCount();
const std::size_t pointCount2 = second.getPointCount();
for (std::size_t i = 0; i < pointCount2; i++)
{
//Vector AB is vector point[i]point[i+1]
//Here we are setting point A and point B
//Point A = tab[i];
sf::Vector2f B;
if (i == pointCount2 - 1) // si c'est le dernier point, on relie au premier
B = second.getTransform().transformPoint(second.getPoint(0));
else // sinon on relie au suivant.
B = second.getTransform().transformPoint(second.getPoint(i + 1));
//vector D = vector AB
const sf::Vector2f D(getVectorTwoPoints(second.getTransform().transformPoint(second.getPoint(i)), B));
//Vector T = vector AP
for (std::size_t j = 0; j < pointCount1; j++)
{
const sf::Vector2f T(getVectorTwoPoints(second.getTransform().transformPoint(second.getPoint(i)), first.getTransform().transformPoint(first.getPoint(j))));
if (D.x*T.y - D.y*T.x < 0)
return false; // un point à droite et on arrête tout.
}
}
return true; // si on sort du for, c'est qu'aucun point n'est à gauche, donc c'est bon.
}
Je vous remercie d'avance pour vos suggestions!