WPF France

  • Augmenter la taille
  • Taille par défaut
  • Diminuer la taille

Calculer la différence entre deux angles tout en conservant le signe

Envoyer Imprimer PDF
Note des utilisateurs: / 1
MauvaisTrès bien 

Lorsque vous mettez en place des animations avec WPF, Surface ou même JavaFX vous avez certaines fois besoin de savoir comment évolue un angle.

Par exemple, vous avez en votre connaisance le nouvel angle d'un objet - sa nouvelle orientation - et vous connaisez l'ancienne valeur de cette orientation : comment calculer l'évolution de cet angle ?
calculateAnglesBetweenOrientationExemple1
(Cette ligne est l'orientation = 0°)

Une première solution

C'est très simple allez vous me dire, il suffit d'écrire :

double difference = secondAngle - firstAngle; 
Mais ce bout de code peut conduire à des erreurs !

En effet, la valeur fournie par le système est relative à une certaine valeur et redémarre à 0° si on dépasse les 360°... Prenons un example : si l'objet était orienté à 358° et que l'utilisateur le tourne de 5° nous obtenons une différence de (3-358= -355° la ou nous souhaitons en fait obtenir 5° !

Une meilleure solution

La solution que je propose prend comme axiome de base que la méthode est appellée suffisamment fréquemment pour que lorsqie l'objet tourne, il n'a pas le temps de tourner plus d'un demi-tour (180°).

Partant de cela, nous pouvons considérer que la direction de la rotation est toujours le "chemin le plus court" : c'est le rasoin d'Ockham ! Si cela est plus court  d'aller à gauche pour obtenir le nouvel angle alors nous choisisons le signe qui indique que la rotation s'est faite vers la gauche. Une image vaut mille mots :

calculateAnglesBetweenOrientationExemple2

(Dans ce schéma, la ligne noire correspond à l'angle initial et la ligne rouge au nouvel angle de l'objet)

Nous avons alors cette méthode :

 private double calculateDifferenceBetweenAngles(double firstAngle, double secondAngle)
 {
 double difference = secondAngle - firstAngle;
 while (difference < -180) difference += 360;
 while (difference > 180) difference -= 360;
 return difference;
 }

Un cas d'utilisation

Oui, c'est bien beau mais à quoi cela nous sert ?

Cela nous est utile lorsque l'on construit un carousel : l'utilisateur peut cliquer sur un élément particulier et le carousel doit se tourner afin que cet élement soit en face de l'utilisateur. Il est alors nécessaire de connaitre ce bon angle. Je n'ai trouver aucun autre moyen de le faire !

Connaissez-vous une autre solution ?

(Article traduit de l'anglais depuis : http://blog.lexique-du-net.com )

Commentaires (0)
Mise à jour le Mardi, 23 Mars 2010 10:18  

Partagez


Article au hasard

  • Par bien des aspects, le composant GridView de WPF est assez limité par rapport à son homologue de Windows Forms (DataGridView)… Une des principales fonctionnalités manquantes est la gestion automatique du tri lorsque l’utilisateur clique sur un en-tête de colonne. Cet article propose une solution à base de propriétés attachées, qui permet de gérer ce tri proprement et de façon totalement déclarative en XAML.

    Commentaires (0)...
    Lire la suite...