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

Image non trouvée !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é.

Image non trouvée !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.

Image non trouvée !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:

Image non trouvée !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

Image non trouvée !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.