Problème de trigonométrie : obtenir des degrés avec la fonction tan()

apocaalypsoapocaalypso Membre
19:09 modifié dans API UIKit #1
Bonjour,

J'ai une image représentant un triangle pointant vers le haut.
Je voudrais faire tourner l'image pour qu'elle pointe vers le centre d'une UIImageView. Pour obtenir l'angle, j'utilise la trigonométrie et plus particulièrement tan. Mais il ne tourne jamais dans la bonne direction.

Voici mon code :
float calc = (fleets.center.x - finalPlanet.center.x)/(finalPlanet.center.y - fleets.center.y);<br />maImageView.transform = CGAffineTransformMakeRotation(tan(calc));


Je me suis dit que c'est probablement parce que je n'obtiens pas des radians.
Si quelqu'un pourrait éclairer ma lanterne, je lui en serais très reconnaissant.

Merci d'avance !

Guillaume.

Réponses

  • fouffouf Membre
    19:09 modifié #2
    Avec tan, ca ne fonctionnera jamais, car tan(alpha) c'est un nombre sans unité, c'est un rapport de longueur (coté opposé sur coté adjacent). Par contre, avec arctan tu devrais avoir ce que tu cherches. Et arctan renvoie toujours un angle en radians ; si tu veux le transformer en degrés il faut le multiplier par 180/M_PI, mais je te conseille de toujours travailler en radians (sauf pour l'affichage) car toutes les fonctions trigo sont écrites pour prendre des angles en radians.
  • Philippe49Philippe49 Membre
    mai 2009 modifié #3
    arctan (atan en C) renvoie toujours un angle entre -Pi/2 et Pi/2. Il faut utiliser atan2(y,x) qui renvoie l'angle entre -Pi et Pi du vecteur (x,y) avec l'horizontale.

    atan2(finalPlanet.center.y - fleets.center.y,fleets.center.x - finalPlanet.center.x)
    est l'angle que fait le vecteur de fleets.center vers finalPlanet.center avec l'horizontal.

  • apocaalypsoapocaalypso Membre
    19:09 modifié #4
    Merci beaucoup de vos réponse !
    J'avais aussi testé avec tanl, tanh, etc...

    J'ai donc fait :
    fleets.transform = CGAffineTransformMakeRotation(atan2(finalPlanet.center.y - fleets.center.y, fleets.center.x - finalPlanet.center.x));<br />
    


    Mais l'image ne pointe pas bien, pourtant mes formules sont bonnes, je les ai faà®tes sur papier d'abord pour pouvoir vérifier.
  • Philippe49Philippe49 Membre
    mai 2009 modifié #5
    C'est parce que la flèche du triangle n'est pas le centre de l'image. Il faut calculer l'angle pour que la flèche du triangle soit sur le segment reliant les deux centres
  • apocaalypsoapocaalypso Membre
    19:09 modifié #6
    C'est à  dire ?
    Il faudrait que le centre de mon triangle soit sa pointe c'est ça ?
  • Philippe49Philippe49 Membre
    19:09 modifié #7
    Ton angle de rotation doit tenir compte de l'angle initial du centre(fleets)->pointe par rapport à  l'horizontal.
  • apocaalypsoapocaalypso Membre
    19:09 modifié #8
    Merci beaucoup pour ton projet-exemple !
    Effectivement, chez toi, ton image est à  l'horizontale vers la droite d'où le M_PI. Chez moi, la flèche pointe vers le haut, j'ai donc du utiliser M_PI/2.

    Grâce à  toi j'ai réussi à  le faire marcher, j'ai donc :
    Pour une direction top-left :
    fleets.transform = CGAffineTransformMakeRotation(atan2(fleets.center.y - finalPlanet.center.y, fleets.center.x - finalPlanet.center.x)-(M_PI/2));<br />
    

    top-right :
    fleets.transform = CGAffineTransformMakeRotation((M_PI/2)-atan2(fleets.center.y - finalPlanet.center.y, finalPlanet.center.x - fleets.center.x));<br />
    

    bottom-left :
    fleets.transform = CGAffineTransformMakeRotation(-(M_PI/2)-atan2(finalPlanet.center.y - fleets.center.y, fleets.center.x - finalPlanet.center.x));
    

    bottom-right :
    fleets.transform = CGAffineTransformMakeRotation((M_PI/2)+atan2(finalPlanet.center.y - fleets.center.y, finalPlanet.center.x - fleets.center.x));
    


    C'est le bottom-left qui m'a posé le plus de problème, avant de comprendre qu'il fallait tout mettre en négatif.

    En tout cas merci énormément Philippe !
Connectez-vous ou Inscrivez-vous pour répondre.