Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Problème de mathématiques ?  (Lu 1787 fois)

0 Membres et 1 Invité sur ce sujet

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Problème de mathématiques ?
« le: Juillet 03, 2013, 02:23:40 am »
Bonjour,

je suis en train de mettre au point un peu truc avec la SFML mais je bute actuellement sur un petit problème...

J'essaye de faire pivoter un objet dans la direction de la souris.

sf::Vector2i pos = sf::Mouse::getPosition(window);
float diffx = fabs(pos.x - player.getOrigin().x);
float diffy = fabs(pos.y - player.getOrigin().y);
if(diffy == 0)
    diffy = 0,001; //0 est une valeur interdite !
float angle = atan(diffx/diffy) * 180 / PI; //#define PI 3.14159265
if(pos.x > player.getOrigin().x && pos.y < player.getOrigin().y)
    player.setRotation(angle);
else if(pos.x > player.getOrigin().x && pos.y > player.getOrigin().y)
    player.setRotation(90 + angle);
else if(pos.x < player.getOrigin().x && pos.y > player.getOrigin().y)
    player.setRotation(180 + angle);
else if(pos.x < player.getOrigin().x && pos.y < player.getOrigin().y)
    player.setRotation(360-angle);

Voilà, mais cet algorithme ne marche pas... pourtant je n'arrive pas à comprendre...
Les angles obtenus via atan sont en radian, je les passe donc en degré (ce qui est attendu par SFML)
Je pense avoir pensé à tout, à la valeur interdite pour la division, j'ai même fait des dessins, je vois pas le problème... Mais l'orientation de mon objet reste incohérente....

Merci d'avance :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de mathématiques ?
« Réponse #1 le: Juillet 03, 2013, 08:08:07 am »
Y a pas mal d'erreurs dans ton code :

- il faut utiliser la position de l'entité, pas son origine
- il faut transformer la position de la souris ; même si tu n'as pas de vue perso, c'est une bonne habitude à prendre
- il ne faut jamais utiliser std::atan, mais plutôt sa variante std::atan2

sf::Vector2i cursor = sf::Mouse::getPosition(window);
sf::Vector2f diff = window.mapPixelToCoords(cursor) - player.getPosition();
float angle = std::atan2(diff.y, diff.x) * 180 / PI;
player.setRotation(angle);

Il faudra peut-être inverser l'angle ou bien diff.y, mais sinon ça devrait le faire.
« Modifié: Juillet 03, 2013, 12:20:08 pm par Laurent »
Laurent Gomila - SFML developer

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Re : Problème de mathématiques ?
« Réponse #2 le: Juillet 03, 2013, 12:14:13 pm »
Merci maintenant ça marche super bien ;)