2009-11-22 7 views
0

Exemple: J'ai un cercle divisé en deux moitiés. La moitié va de 0 à -179999999999999 tandis que l'autre va de 0 à 179,99999999999. Exemple typique: transform.rotation.z d'un CALayer. Au lieu d'atteindre de 0 à 360, c'est comme ça. Donc quand je veux développer une jauge par exemple (en théorie), je veux lire des valeurs de 0 à 360 plutôt que d'obtenir un -142 et de penser à ce que cela pourrait être sur cette échelle de 0 à 360.Comment échanger des valeurs de rotation négatives sur des valeurs de rotation positives?

Comment convertir cela mathématiquement correctement? Sinus? Cosinus? Y a-t-il quelque chose d'utile pour cela?

+0

Pourquoi ne pas suivre la suggestion fournie en réponse à votre question précédente: http://stackoverflow.com/questions/1778738/how-to-resolve-this-rotation-problem et créer une variable d'instance distincte pour suivre la rotation, plutôt que de compter sur la transformation d'un calque? –

Répondre

2

est-ce pas la normalisation atteint par quelque chose d'aussi simple que:

assert(value >= -180.0 && value <= +180.0); 
if (value < 0) 
    value += 360.0; 

je serais probablement même mis cela en fonction si je vais en avoir besoin en plus d'un endroit. Si le code doit traiter des nombres qui pourraient déjà être normalisés, alors vous changez l'assertion. S'il doit traiter des nombres en dehors de la plage -180 .. + 360, alors vous avez plus de travail à faire (en ajoutant ou en soustrayant des multiples appropriés de 360).

+0

Cette approche est plus contre-intuitive que les nombres négatifs. Dites que vous faites une rotation entre -1 et 1 degrés, le nombre passera de 359 à 1. Si vous mettez cela sur un affichage visuel, ce sera très ennuyeux. Mon approche déplace l'origine pour rendre la transformation continue. –

+1

Codeur @ZZ: Sur une boussole, le palier 359 ° est à seulement 2 degrés de 001 °, exactement les mêmes que -1 ° et + 1 ° sont espacés de 2 degrés. Donc, je ne comprends pas votre objection. Cependant, je pense toujours que l'ajout de 180 ° à un roulement signifie qu'il pointe dans la direction opposée à l'endroit où il pointait avant d'ajouter un décalage. –

0

Say x est la valeur avec une plage (-180, 180), y est la valeur que vous voulez afficher,

y = x + 180; 

qui va changer la lecture de changement de gamme (0, 360).

+0

L'objectif est probablement de faire correspondre les valeurs de -180 à -0 de 180 à 360, plutôt que simplement d'ajouter 180 toutes les valeurs. Pour les directions, ajouter 180 inverse la direction parcourue. –

2
while (x < 0) { 
    x = x + 360; 
    } 

while (x > 360) { 
    x = x - 360; 
    } 

Cela fonctionnera sur n'importe quelle valeur, positive ou négative.

0

Si cela ne vous dérange pas de passer quelques cycles CPU supplémentaires sur des valeurs qui sont déjà positifs, cela devrait fonctionner sur toute valeur -360 < x < 360:

x = (x + 360) % 360; 
+0

Cela dépend de la langue de l'hôte, mais '%' ne fonctionne pas en C ou C++ si les tersm de l'expression ne sont pas des entiers. –

+1

Il semble que j'ai passé trop de temps à essayer d'autres langues. On dirait qu'il y a une fonction fmod() dans math.h, mais peut-être pas sur l'iPhone. Utiliser une condition/boucle pourrait être plus sûr, alors. –

0

Je fournir le code pour retourner 0 - Les valeurs d'angle de 360 ​​degrés de la propriété de transformation de la couche en this answer à previous question.

Questions connexes