Les matrices 2D sous Android
Voici une classe qui va permettre de gérer des instances de matrices. Bien utile afin d'effectuer simplement des translations, rotations, agrandissements d'objets graphiques 2D.
Instancier la matrice
L'utilisation reste simple, Tout d'abord création d'une instance de matrice
Matrix m = new Matrix();
ou Matrix m = new (Matrix src); Dans ce cas, l'instance m est une copie de la matrice src
Il existe plusieurs
classes gérant des matrices sous OpenGL. Il s'agit ici de android.graphics.Matrix
A ne pas confondre avec android.opengl.Matrix plutôt orientée OpenGL SE.
Initialiser la matrice
Puis initialisation de cette matrice à la matrice identité ou unité.
m.reset() pour inititialiser la matrice à la matrice identité.
boolean isIdentity()
permettra de vérifier qu'une matrice est une matrice identité
ou non.
Vous pouvez aussi initiialiser vous même votre matrice en utilisant setValues(float[] values) ou values sera un tableau de 9 éléments de la matrice.
ou encore utiliser set(Matrix src) pour avoir une copie de la matrice src.
Si src est null,
cela revient à initialiser la matrice courante en matrice identité.
Définir les transformations
Vous préparez votre matrice pour toutes les transformations ou rotations pour aboutir à votre nouvelle matrice:
Il existe 3
types de méthodes:
set, pre ou post
Les méthodes set appliquent une transformation sans tenir compte des éventuelles transformations précédentes. Les précédentes transformations seront donc perdues, seule la dernière transformation set sera appliquée.
Les méthodes pre appliquent la transformation avant une transformation déjà précisée.
Les métodes post appliquent la transformation après qu'une première transformation est été indiquée.
Vous ne devriez donc trouvez qu'une méthode set, puis éventuellement 1 ou plusieurs méthodes pre et/ou post.
Exemple de transformation:
void setRotate(float degrees) pour une rotation
void setScale(float sx, float sy) pour agrandir selon sx et sy
void setTranslate(float dx, float dy) pour une translation suivant dx et dy
boolean preRotate(float degrees)
boolean preScale(float sx, float sy)
boolean preTranslate(float dx, float dy)
boolean postRotate(float degrees)
boolean postScale(float sx, float sy)
boolean postTranslate(float dx, float dy)
Pour pouvez aussi concaténer deux matrices avec concat en set, pre ou post
...
Effectuer les transformations de coordonnées
La matrice est ainsi prête pour effectuer une ou des transformations de coordonnées que vous allez vouloir appliquer sur des points, des rectangles.
Par exemple pour transformer les coordonnées d'un rectangle:
boolean mapRect(RectF rect)
Ou pour obtenir le résultat de cette transformation dans une nouvelle
instance RectF: boolean mapRect(RectF dst, RectF src)
De même avec des points (x,y):
void mapPoints(float[] pts) ou pts est un tableau de points avec des coordonnées x et y, la maj étant faite directement dans pts
void mapPoints(float[] dst, float[] src) pour obtenir un tableau avec les transformation
tout en gardant le tableau d'origine
ou encore void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex,
int pointCount)
Exemple
Voici un exemple très bête:
Pour les valeurs 1, 1, 2 et 3 nous obtenons bien 8, 12,16 et 36
soit 1x2x2x2 et 1x3x2x2
puis 2x2x2x2 et 3x3x2x2
Comme vous pouvez
le voir dans l'exemple ci-dessus, il ne sera pas nécessaire de réinitialiser
la matrice pour calculer les transformations des points après celles
du rectangle.