arrondit , condition et modulo

bonjour
je suis en tsi et je travaille actuellement sur un robot autonome.
je suis amené tester en condition si l'angle de mon robot est conforme ou non à la direction dans laquelle je lui demande daller.

voici se que j'ai fait

if(((oriente == sud)&&(((cos(degrereel)>-sqrt(2)/2)&&(cos(degrereel)<=sqrt(2)/2)&&(sin(degrereel)>=-sqrt(2)/2)&&(sin(degrereel)<=-1))!)){}

vous l'aurais compris c'est bien trop foullit.
surtout que se genre de condition devras se répéter tout le long du programme
comment puis'je simplifier sa, d'une par en réduisant mon degreereel (modulo 2Kpie)
et d'autre par en posant : si degrereel et environ égal à 90 dégrée. ou bien suis'je obligé de passé par un encadrement

Bonjour,

Dans un premier temps, si tu compares souvent à une même constante provenant d'un calcul comme 'sqrt(2)/2', place plutôt le résultat dans une variable. Cela évitera de recalculer à chaque fois donc gain de temps et de lisibilité.
Ensuite pourquoi isoler une portion d'angle par une combinaison de son sinus et cosinus quand tu peux directement le faire avec l'angle lui-même ((degrereel>225) && (degrereel<=315)).

Pour le modulo, regarde ici

En combinant tout et en utilisant une variable d'ouverture +/- angle autour de 270°, ça va simplifier ton code.

Édit: pour en revenir à ta formule, en limitant le sinus entre -0,7.. et -1, tu limites aussi la fenêtre des cosinus. L'ajout du cosinus te permet juste de choisir entre le troisième et le quatrième cadran.

Comme ce sont tous des 'et', tu peux ôter les parenthèses.
À quoi sert le ! à la fin de la condition ?

Zlika:
Ensuite pourquoi isoler une portion d'angle par une combinaison de son sinus et cosinus quand tu peux directement le faire avec l'angle lui-même...

Disons qu’il faut ramener l’angle peut être entre [0, 360[ dans ce cas (et pas en radian sinon tester entre [0, 2Pi[). Mais ce sera plus rapide que sinus et cosinus

bon voila déjas quelque changement

degrereel= degrereel % 360 
                 
 if(((oriente == sud)&&(135>=degrereel>=45)!){}

le ! est la car je teste si l'orientation demandé n'est pas en phase avec l'orientation réelle.
sinon les problèmes que je vois maintenant sont:
pour faire la simplification de mon angle j'utilise % mais il me semble qu'on ne peux le faire avec une variable float, degrereel en est une je ne peux m'en passé mon robot étant autonome , la précision est primordial.

d'autre part degrereel peut tout a fait passé dans le négatif le robot peut tourné dans les deux sens trigo et horaire, y'a t'il une solution pour convertir un angle négatif en positif quand je simplifie l'anglereel ou bien dois'je ajouté dans ma condition un || avec les valeur négative équivalente

est-ce que degrereel n'était pas en radian?

sinon ça (135>=degrereel>=45)!ce n'est pas du C++...

il faut séparer les test avec < et > (ou <= et >=) et faire des && ou ||

@J-M-L Je le pense aussi, d'où la question. :wink:
Reste à savoir dans quelle unité tu veux travailler car dans ton premier post, tu utilises degrés et pi...

y'a t'il une solution pour convertir un angle négatif en positif?

Ajoute 360 jusqu'à ce qu'il devienne positif.

vis à vis du programme qu'il soit en radiant ou non n'a pas trop d’importance il me suffit de modifié son calcule pour cela, effectivement j'été partis en radiant au début car j'utilisé du cos et du sinus, désolé de ne pas avoir précisé le changement.

sinon dois'je séparé les inégalité pour le langage ?

(135>=degrereel)||(degrereel>=45))!
degrereel= degrereel % 360 

if (degrereel < 0){degrereel = degrereel + 360
                 
 if(((oriente == sud)&&((135>=degrereel)||(degrereel>=45))!){}

si j'ai bien tout compris

Bonjour,bengloo59

bengloo59:
le ! est la car je teste si l'orientation demandé n'est pas en phase avec l'orientation réelle.

Je ne comprends pas à quoi est censé servir le "!" ????

Cordialement,
bidouillelec

Ça devient compliqué à la lecture :confused:.
Pourquoi n'utilises tu pas les angles du cadran 3 et 4 avec un ET logique plutôt que d'utiliser l'inversion ?

le ! signifie l'inverse de se qui a avant de mémoire

je demande si degrereel n'est pas dans intervalle

sa me semblais logique mais si il y'a une solution plus simple je suis preneur , si je comprend bien tu me conseille de changer directement intervalle

Zlika:
Ça devient compliqué à la lecture :confused:.
Pourquoi n'utilises tu pas les angles du cadran 3 et 4 avec un ET logique plutôt que d'utiliser l'inversion ?

yes

Le not (!) s'utilise généralement devant la variable booléenne à inverser.

donc

degrereel= degrereel % 360 

if (degrereel < 0){degrereel = degrereel + 360
                 
 if(((oriente == sud)&&((135<=degrereel)||(degrereel<=45)){}

mais il me reste toujours le probléme du % qui n'accepte pas les variable float :confused:

Bonjour,

Peut-être travailler en BAM ?
Et penser à un hystérésis.

Cordialement,
bidouilleelec.

Si je me réfère au code de ton premier post, tu veux tester si tes deux conditions sont vraies, donc tu dois choisir la fourchette des deux angles limites. Pour le sud, c'est 270 plus ou moins 45 degrés.

if (degrereel < 0){degrereel = degrereel + 360}
if (degrereel > 360){degrereel = degrereel - 360}
if (degrereel < 0){degrereel = degrereel + 360}
if (degrereel > 360){degrereel = degrereel - 360}

je pense avoir trouvé un bonne solution , en prenant en conte que l'on tournera jamais de plus de 2*360 degree

Pourquoi ne pas recréer la variable complète. Tu calcules sa partie entière avec le modulo et tu ajoutes la partie décimale (ou l'inverse en ajoutant que la partie décimales au résultat du modulo)

bidouilleelec:
Peut-être travailler en BAM ?

c'est à dire je suis pas sur de bien comprendre

sinon toucher a la variable comme sa me semble bien compliqué surtout que je devrais répété sa au moins une dizaine de fois et personnellement je ne sais pas comment on fait des arrondis dans se langage :E(..)?