Traiter avec Angle de l'Envelopper dans du code c++
Est-il un chemin vers la sécurité et de simplement traiter avec angle d'enveloppement au minimum le nombre de cas annuels.
Angle d'enveloppement se produit lors de l'utilisation d'une représentation particulière de l'angle (soit 0-360 ° ou -180 à 180 deg (ou l'équivalent en radians)) et vous enchaînez sur l'angle. Par exemple, disons que vous avez un angle de -170, et de vous soustraire 50 deg. Vous mathématiquement ajouter jusqu'à -220 mais devrait en fait être de +140°.
Évidemment, vous pouvez vérifier cela à l'aide:
if (deg < -180) { 180 - abs(deg + 180); }
ou similaire. Mais tout d'abord vous avez besoin d'une multitude de contrôles et d'autre part ça ne fonctionne pas si vous enroulez deux fois.
Le second cas où cette situation prévaut est dans l'interpolation entre les deux angles.
Par Exemple, dire que j'ai un angle de -170 ° et 160 ° et je tiens à mi-chemin entre eux. Une façon courante de le faire est ang1 + 0.5(ang2-ang1)
mais dans l'exemple que j'ai fourni, il sera la cause de l'angle de -5 deg quand il doit être de 175.
Est a t-il un moyen de gérer l'angle de l'envelopper dans ces scénarios?
- Êtes-vous après la performance? Ou tout simplement les plus brefs solution qui fonctionne?
- Pas de performance, plus de la simplicité et de la facilité de lecture. (Évidemment, le nombre complexe peut être pas le cas mais je voudrais quand même avoir un coup d'oeil à qui).
- Si vous souhaitez normaliser un angle de
[0, 360)
? - Eh bien, pour être honnête, je préfère traiter avec la normalisation de [-180 et 180)
- À l'égard de votre edit: Il y a deux façons de le traversent, un angle. Et ils diffèrent par exactement 180 degrés. L'algorithme que vous avez donne l'un d'eux. Ajouter/soustraire à 180 degrés et vous obtenez de l'autre. À ce stade, vous devriez envelopper de [-180,180). Vous avez maintenant deux angles, vous pouvez choisir le "meilleur" d'entre eux en voyant ce qui est "plus proche" de la période initiale de deux angles.
- j'ai ajouté une réponse à l'aide de votre réponse, auriez-vous l'esprit d'avoir un rapide vérifier pour voir si vous pensez que cela va fonctionner?
Vous devez vous connecter pour publier un commentaire.
Pour être complet, je vais inclure à la fois
[0, 360)
et[-180, 180)
normalisations.Vous aurez besoin
#include <math.h>
.Normaliser à
[0,360)
:Normaliser à
[-180,180)
:Le modèle doit être assez facile de reconnaître généraliser radians.
Angle De Bissection:
Cela devrait traversent, un angle sur la "petite" côté. (attention: pas entièrement testé)
double constrainAngle(const double x);
fmod(x,y)
a le même signe que x.double x = -0.0000001;
- Je trouver de l'aide
reste()
à partir de la bibliothèque de mathématiques est pratique. Étant donné un anglea
, pour contraindre à -180, 180, tu peux faire:et modifier le
360.0
à2.0 * M_PI
pour radiansDonc, si trouvé un moyen efficace de faire ce que je veux à l'aide de Mystique de l'approche de contraindre l'Angle. Ici, il est:
Cela semble fonctionner avec n'importe quel exemple je pense.
constrainAngle()
. Donc, je pense que nous avons fait.Normaliser un angle de gamme
[-180, 180)
Normaliser un angle de gamme
[0, 360)
Exemples:
deg = -90
->[0, 360)
:deg = 270
->[-180, 180)
:Voir: http://en.cppreference.com/w/cpp/numeric/math/floor
Carte de l'angle(+PI ~ -PI) à signé int valeur (ou valeur courte):
Ensuite, vous pouvez ajouter ou sous la valeur normale. Puis la carte de retour: