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

Mathématiques Discussion :

conserver un angle dans l'intervalle 0-359.999..


Sujet :

Mathématiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut conserver un angle dans l'intervalle 0-359.999..
    Bonjour,
    j'essaie de conserver un nombre flottant (angle) dans un intervalle 0 <= a < 360.
    Voici ce que j'ai fait et qui fonctionne mais est-ce qu'il n'y a pas moyen de faire ça en un seul calcul ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	public void setAngleZ(float angleZ) {
    		if(angleZ > 0)	{
    			this.angleZ[0] = angleZ % 360;
    		}
    		else if(angleZ < 0)	{
    			this.angleZ[0] = 360 + (angleZ % -360);
    		}
    		else	{
    			this.angleZ[0] = angleZ;
    		}
    	}

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    Alors, en Java (parce que j'ai l'impression que ça en est) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setAngleZ(float angleZ) {
    	this.angleZ[0] = ((angleZ % 360) + 360) % 360;
    }
    Par contre, si tu as un langage avec un "vrai" modulo (càd qui ne traite que les entiers et non les réels), tu dois simuler un faux modulo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void setAngleZ(float angleZ) {
    	while(true) {
    		if(angleZ >= 360) angleZ -= 360;
    		else if(angleZ < 0) angleZ += 360;
    		else break;
    	}
    	this.angleZ[0] = angleZ;
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'appuie tout à fait la méthode de bhamp0, c'est à dire pas d'utilisation de modulo.
    Dernière modification par Invité ; 14/11/2010 à 13h57. Motif: orthographe

  4. #4
    Membre expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    Je rajouterai une version sans boucle while disgracieuse, à la mode Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setAngleZ(float angleZ) {
    	this.angleZ[0] = angleZ - Math.floor(angleZ / 360.0) * 360.0;
    }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Et si angleZ est négatif? Je ne sais pas très bien ce que ferait floor, que j'utilise rarement.
    Moi, j'aime bien les boucles, et c'est tout de même l'une des bases de l'informatique.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    floor donne le nombre entier directement inférieur.

    Prenons 4 cas :
    setAngleZ(180) => 180 - 0 * 360 = 180
    setAngleZ(540) => 540 - 1 * 360 = 180
    setAngleZ(-180) => -180 - (-1) * 360 = -180 + 360 = 180
    setAngleZ(-540) => -540 - (-2) * 360 = -540 + 720 = 180

  7. #7
    Membre très actif
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Et si angleZ est négatif? Je ne sais pas très bien ce que ferait floor, que j'utilise rarement.
    Moi, j'aime bien les boucles, et c'est tout de même l'une des bases de l'informatique.
    Et l'équivalent de floor dans un autre langage (Int, Trunc,...) ?
    Pour éviter de se poser de telles questions, j'utilise, si l'angle de départ n'est pas trop loin de [0..360]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while z>=360 do z:=z-360;
    while z <0 do z:=z+360;
    et que je place après l'utilisation du troncage si ce n'est pas le cas

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Si cet angle est le résultat d'une somme ou d'une soustraction, il y a plus simple (pas besoin de modulo) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( angle > 360 )
       angle = angle - 360
    else
    if ( angle < 0 )
      angle = angle + 360

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

Discussions similaires

  1. Ecrire du texte selon un angle dans un TImage
    Par kem dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/10/2005, 09h40
  2. slection dans une intervalle d'enregistrement
    Par toome dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/08/2005, 15h17
  3. Conserver une valeur dans un champs
    Par zakfa dans le forum IHM
    Réponses: 5
    Dernier message: 04/10/2004, 08h48
  4. Réponses: 7
    Dernier message: 02/06/2003, 08h38

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