Tips: Angles et géométrie
Par -Alexandre LEGOUT aka LAlex- le vendredi, juin 20 2008, 13:45 - AS3 / Flex2 - Lien permanent
Je suis actuellement en train de me bruler les neurones sur un éditeur,
permettant entre autres de modifier un visuel à la souris. De quoi devoir
replonger dans nos bonnes vieilles notions de trigo.
J'en profite donc pour donner ici 2-3 astuces
Rotation d'un point
Pour passer d'un point (x, y) à un autre (x', y') en lui appliquant une
rotation d'angle a, l'équation est la suivante:
x' = x*cos(a) - y*sin(a)
y' = x*sin(a) + y*cos(a)
Ce qui nous donne un petite méthode AS3:
public function rotatePoint(point : Point, angle : Number, isRadian : Boolean = false) : Point {
if (ang == 0) return point.clone();
var radAngle : Number = isRadian ? angle : angle * Math.PI / 180;
var angleCos : Number = Math.cos(radAngle);
var angleSin : Number = Math.sin(radAngle);
return new Point(point.x * angleCos - point.y * angleSin, point.x * angleSin + point.y * angleCos);
}
Notez que l'on peut passer cette méthode un angle en degré (par défaut) ou en radians.
Angle fait par un vecteur
L'AS3 nous fournit une méthode toute prête: Math.atan2. Elle prend
en paramètre les coordonnées du vecteur (j'utilise un point dans l'exemple) et
retourne un angle en radian (d'où le flag isRadian de la méthode
précédente).
Notez bien que la coordonnée 'y' est le premier argument
(chez moi, FDT m'affiche 'x' en premier, je me suis fait avoir au début)
var vector : Point = new Point(mouseX, mouseY);
var angRadian : Number = Math.atan2(vector.y, vector.x);
Normaliser un angle
Selon les besoins, il peut être nécessaire d'utiliser systématiquement un angle entre 0 et 360, ou entre -180 et 180. Avec les modulos, cela peut se faire facilement:
// Get a random number between -1500 and 1500
var angle : Number = Math.random() * 3000 - 1500;
// Normalize angle between 0 and 360
var angleIn360 : Number = ((angle % 360) + 360) % 360;
// Normalize angle between -180 and 180
var angleIn180 : Number = ((angle % 360) + 540) % 360 - 180;
---
Voilà pour les ch'tites astuces de l'oncle LAlex ![]()
Commentaires
Super,
ça devrait pas tarder à me servir.
merci
pour la rotation, c'est pas plus efficace de passer par une matrice avec la méthode transformPoint()?
hop, ma réponse tout seul, la matrice pourrait commencer à être vraiment intéressante pour un très gros nombre de points qui tournerait d'un même angle, si l'angle change c'est mort.
@monkey> 'tain, j'avais même pas vu cette méthode! Je me voyais déjà recoder la multiplication matrice x point...
Par contre, pour une simple rotation sur un simple point, comme tu le dis, ca a peu de chances d'être interessant: en gros, ca ferait la même chose que ma petite fonction, mais en rajoutant l'appel au constructeur 'Matrix', ainsi que l'application des opérations de translation/homotétie qui ne sont pas nécessaire pour une simple rotation.... Bref, comme toujours, la réponse est "ca dépend"!
Fil des commentaires de ce billet