Comment transformer les degrés (angle) en numéro face
-
14-11-2019 - |
Question
J'ai une image qui contient 40 images tournées.
Avec l'index d'image commençant à 0. 0-39 en fait.
Voici le code qui transforme 0-39 en degrés
int image_direction = 0; //Can be 0-39
int facing_degrees = (int)(360.0 * (-(image_direction- 10.0))/40.0);
while(facing_degrees < 0)
facing_degrees += 360;
while (facing_degrees > 360)
facing_degrees -= 360;
Alors oui, cela peut également donner des degrés négatifs ainsi que des degrés sur 360. C'est donc pourquoi il y a les 2 boucles.
Maintenant, je souhaite inverser ce processus dire que je spécifie 90 degrés que je voudrais récupérer 0.
Je pensais faire quelque chose comme
if(degrees == 90 || degrees >= 80 && degrees <= 99)
image_direction = 0;
elseif(degrees == 100 || degrees >= 91 && degrees <= 109)
image_direction = 39;
//etc.......
Eh bien, je ne suis pas doué en mathématiques, eh bien j'ai oublié ce genre de choses.
Je me demande comment pouvez-vous inverser la fonction qui donne des degrés de l'image_direction pour courir en arrière dans une équation simple pour éviter l'énorme cas de déclarations IF.
Voici quelques résultats
Image Index = 0 Image Degree = 90
Image Index = 1 Image Degree = 81
Image Index = 2 Image Degree = 72
Image Index = 3 Image Degree = 63
Image Index = 4 Image Degree = 54
Image Index = 5 Image Degree = 45
Image Index = 6 Image Degree = 36
Image Index = 7 Image Degree = 27
Image Index = 8 Image Degree = 18
Image Index = 9 Image Degree = 9
Image Index = 10 Image Degree = 0
Image Index = 11 Image Degree = 351
Image Index = 12 Image Degree = 342
Image Index = 13 Image Degree = 333
Image Index = 14 Image Degree = 324
Image Index = 15 Image Degree = 315
Image Index = 16 Image Degree = 306
Image Index = 17 Image Degree = 297
Image Index = 18 Image Degree = 288
Image Index = 19 Image Degree = 279
Image Index = 20 Image Degree = 270
Image Index = 21 Image Degree = 261
Image Index = 22 Image Degree = 252
Image Index = 23 Image Degree = 243
Image Index = 24 Image Degree = 234
Image Index = 25 Image Degree = 225
Image Index = 26 Image Degree = 216
Image Index = 27 Image Degree = 207
Image Index = 28 Image Degree = 198
Image Index = 29 Image Degree = 189
Image Index = 30 Image Degree = 180
Image Index = 31 Image Degree = 171
Image Index = 32 Image Degree = 162
Image Index = 33 Image Degree = 153
Image Index = 34 Image Degree = 144
Image Index = 35 Image Degree = 135
Image Index = 36 Image Degree = 126
Image Index = 37 Image Degree = 117
Image Index = 38 Image Degree = 108
Image Index = 39 Image Degree = 99
Image Index = 0 Image Degree = 90
Image Index = 1 Image Degree = 81
Image Index = 2 Image Degree = 72
Image Index = 3 Image Degree = 63
Image Index = 4 Image Degree = 54
Image Index = 5 Image Degree = 45
Image Index = 6 Image Degree = 36
Image Index = 7 Image Degree = 27
Image Index = 8 Image Degree = 18
La solution
De votre cartographie de l'entrée aux sorties, je les ai collées dans Excel et j'ai déterminé que la formule pour calculer les degrés est la suivante:
RawDegrees = 90 - (index * 9)
Ensuite, le coup à 0 ... 360 (enveloppez en utilisant la boucle while), vous obtenez votre sortie finale de diplômes. La formule à inverser est trouvée en réorganisant ce qui précède pour faire indexer le sujet
RawDegrees - 90 = - (index * 9) --- 1 RawDegrees/9.0 - 10 = -index --- 2 Therefore index = 10 - Degrees/9.0
Cela vous donnera le mappage suivant
Degree Discovered Index 90 0 81 1 72 2 63 3 54 4 45 5 36 6 27 7 18 8 9 9 0 10 351 -29 342 -28 333 -27 324 -26 315 -25 306 -24 297 -23 288 -22 279 -21 270 -20 261 -19 252 -18 243 -17 234 -16 225 -15 216 -14 207 -13 198 -12 189 -11 180 -10 171 -9 162 -8 153 -7 144 -6 135 -5 126 -4 117 -3 108 -2 99 -1 90 0 81 1 72 2 63 3 54 4 45 5 36 6 27 7 18 8
Tout ce que vous avez à faire est d'effectuer une enveloppe pour couper la réponse à 0..39, par exemple
index = index < 0 ? index + 40 : index;
pour obtenir la bonne sortie.
Soit dit en passant, votre code d'index à degrés peut être factorisé comme suit pour obtenir la même sortie (valide pour les entrées 0..39)
int facing_degrees = (int)(90.0 - (image_direction * 9.0));
facing_degrees = facing_degrees < 0 ? facing_degrees + 360 : facing_degrees;
Autres conseils
Hmm pourquoi ne pas utiliser quelque chose de similaire à la "formule à pourcentage" avec un petit ajustement:
image_direction = (int)(((float)(degrees-90) / 360) * 40) % 40;
if (image_direction < 0)
image_direction += 40; // for negative integers
Décomposer la formule; Nous divisons les degrés par 360 et multiplions par 40 pour obtenir l'image correcte étant donné un degré spécifié, nous utilisons ensuite l'opérateur modulo pour conserver l'image_direction dans la plage 0-39 pour les degrés> +360 ou <-360 et enfin, si le degré était un négatif, une image_direction se révélera négative, donc l'ajout de 40 corrigera l'image_direction.
J'espère que cela t'aides.
Edit: Oh désolé, je semblait avoir raté la partie environ un degré de 90 == Index d'image de 0, assez facile à ajouter ici, il suffit de soustraire 90 du degré réel (code édité ci-dessus)