IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Algorithme de déplacement : calculer un angle


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut Algorithme de déplacement : calculer un angle
    Bonjour,

    J'ai besoin de faire en sorte qu'un objet fixe soit toujours tourné vers un point mobile, sur un plan orthonormé (2D).

    J'utilise donc la fonction tan ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    angle = (Math.tan((World.x - Objet.x) / (World.y-Objet.y))*(180/Math.PI));
    Cela fonctionne cependant je suis obligé de mettre des conditions lorsque une valeur ou l'autre est inférieur...Du coup je bricole un peu la chose par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       if ( Math.abs(Game.x - x) < Math.abs(Game.y - y) ){
                if ( Game.y - y > 0 ){
                    d = (Math.tan((Game.x - x) / (Game.y-y))*(180f/(float)Math.PI))-90f;
                }else{
                    d = (Math.tan((Game.x - x) / (Game.y-y))*(180f/(float)Math.PI))+90f;
                }
            }
    Déjà j'aime pas ce genre de bricolage est il vraiment nécessaire ou connaissez vous une façon plus simple pour obtenir le résultat sans mettre 36000 conditions ?

    En plus, lorsque j'arrive sur les bords l'angle qui en résulte devient légèrement plus grand ce qui fait une saccade quand on passe de l'un à l'autre.

    Merci si vous pouvez m'aider.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    A priori, la fonction atan2 (à deux arguments, pour éviter la division et la perte d'informations corre) sert à résoudre ce genre de problèmes.
    https://nl.mathworks.com/help/matlab/ref/atan2.html
    http://www.cplusplus.com/reference/cmath/atan2/
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    dourouc05 Génial, merci il semblerait que ça marche!

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Heu une dernière chose.

    En fait maintenant que j'ai trouvé l'angle j'aimerais le transformer en longueur et largeur pour faire avancer mon objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            cap = Math.atan2((Game.x - x),(Game.y-y));
            setPosition(x - Game.x, Game.y - y, (float) (cap* (180 / Math.PI))-90); //je dessine l'angle 
     
            x += Math.cos(cap)* ((Game.gameTime()-time)/5000000000f)
            y += Math.sin(cap)* ((Game.gameTime()-time)/5000000000f)
    Le problème est que mon objet se déplace bien dans l'axe...mais à l'envers. J'ai beau essayé de soustraire au lieu d'ajouter, de mettre un Radian avec PI en plus pour faire 180) il inverse toujours la trajectoire.
    -ou un coup il se rapproche puis après il inverse et s'éloigne...

  5. #5
    Invité
    Invité(e)
    Par défaut
    sans contexte (ni définition de tes variables) c'est pas facile de comprendre ce que tu fais... ni pourquoi ca marche pas.

    en revanche, si tu calcules un angle pour...ensuite le repasser en vecteur ptet que ya un pb.

    quand A et B sont deux points... pour que A regardes B il suffit que A regarde dans le sens du vecteur AB...
    si A=(x, y) et B=(Game.x, Game.y)
    trivialement, le vecteur pour regarder vers B est... v=B-A=(Game.x-x, Game.y-y)
    si tu veux te déplacer vers B depuis A... tu normes ton vecteur
    v_u = v/norme(v) et
    dv=v_u*((Game.gameTime()-time)/5000000000f)
    trivialement
    x += dv[0]
    y += dv[1]

    et tu finiras par te rapprocher de B

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Oui, en effet, ça marche.

    Cependant j'aimerais calculer l'avancée x et y en fonction d'un angle et non du vecteur...car cela me permettra de gérer une trajectoire moins brutale : ex l'objet avance et suit un angle qui va toujours chercher à être le plus proche de l'angle qui le mène vers sa cible.
    EX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ( angleDeDirrection < angleDeLaCible ){
           angleDeDirrection = Math.min(angleDeLaCible, angleDeDirrection + vitesseDeChangementDAngle);
    }else{
           angleDeDirrection = Math.max(angleDeLaCible, angleDeDirrection - vitesseDeChangementDAngle);
    }
    du coup si la cible bouge par exemple, l'objet qui va vers lui risque de passer à côté ce qui est voulu...selon le déplacement d'ailleurs, si l'angle reste à peut près le même entre les 2 objets il finiront par se heurter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. algorithme pour le calcul d'une integrale double
    Par awalle dans le forum Mathématiques
    Réponses: 5
    Dernier message: 04/05/2007, 09h35
  2. Calcul d'angles
    Par Giansolo dans le forum Octave
    Réponses: 3
    Dernier message: 27/02/2007, 19h00
  3. calcule d'angle entre 3 points d'une matrice
    Par bmw13fr dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 08/04/2006, 18h56
  4. Algorithme permettant de calculer le PGCD de deux nombres
    Par zeyd dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 25/11/2005, 20h37
  5. calculer un angle
    Par m.nico dans le forum Langage
    Réponses: 7
    Dernier message: 05/11/2003, 20h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo