De manière Standard de normaliser un angle de +/- π radians en Java
Est-il une fonction de la bibliothèque ou bien connu, rapide efficace en Java afin de régulariser un angle de +/- π — par exemple lors de l'ajout de deux angles?
Ce que j'ai maintenant (basé sur cette réponse) est fondamentalement le code ci-dessous...
private static final double TWO_PI = 2 * Math.PI;
double normalize(double theta) {
double normalized = theta % TWO_PI;
normalized = (normalized + TWO_PI) % TWO_PI;
return normalized <= Math.PI ? normalized : normalized - TWO_PI;
}
...mais il semble un peu compliqué et en terme de performance, je ne suis pas enthousiaste à propos de l'opérateur modulo. (Notez que je ne peux pas garantir theta
n'est pas un nombre relativement important, donc je ne pense pas qu'il y est une pure addition/soustraction solution sans boucle. Je ne sais pas vraiment comment un roulé à la main boucle est susceptible de le comparer à d' %
.)
Est-il bien testé optimisé en fonction de la bibliothèque je peux l'utiliser, ou d'un meilleur algorithme, ou est-ce aussi bon qu'il obtient?
180 degrés / full pi.
double possible de moyen Facile de garder les angles entre -179 et 180 degrés
J'ai lu que la réponse, mais étant donné que la plupart de Java mathématiques / géométrie bibliothèques sont en radians il semble plausible qu'il y a une meilleure solution de travail en radians que dans les degrés.
...et en fait @CupawnTae a fourni un bibliothèque de la fonction de réponse.
OriginalL'auteur David Moles | 2014-06-15
Vous devez vous connecter pour publier un commentaire.
Apache commons a un:
http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/util/MathUtils.html#normalizeAngle(double double)
Et en regardant le code source, vous pouvez le reproduire avec ce (qu'ils utilisent leur propre
FastMath.floor
mais dans le cas où vous voulez le faire sans une bibliothèque externe):Source est ici: https://github.com/apache/commons-math/blob/53ec46ba272e23c0c96ada42f26f4e70e96f3115/src/main/java/org/apache/commons/math4/util/MathUtils.java#L107
Note pour les lecteurs de l'avenir: cette méthode a juste (juin 2017) été supprimé à partir de la dernière communes-mathématiques 4.x de la base de code. Si vous utilisez une version après cela, vous aurez envie d'utiliser communes-les numéros à la place (une fois qu'il est sorti) - actuellement:
ou
OriginalL'auteur CupawnTae
Il y a un seul 100% de moyen infaillible:
Tout le reste est des gens qui essaient d'être trop intelligent et, à défaut d'.
MathUtils
), mais c'est aussi 40x plus lent (médiane ~190ns sur mon 15" MBP, contre ~4.9 ns en utilisantMathUtils
), qui peut être plus important pour certaines applications.Je suis d'accord, atan2 peut être lent. Mais il traite les cas avec NaN et ±Infini.
MathUtils poignées de ceux aussi bien-il renvoie NaN pour tous les trois, tout comme atan2.
Cette méthode a d'étranges artefacts à certains angles. Je n'ai jamais été en mesure de le faire fonctionner à 100% à toute épreuve, même si elle fonctionne en théorie.
OriginalL'auteur cohadar