Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flash Pascal Discussion :

Le point sur les matrices


Sujet :

Flash Pascal

  1. #1
    Rédacteur/Modérateur

    Le point sur les matrices
    Bonjour !

    Qu'est-ce qu'une matrice ? J'ai vu plusieurs exemples sans jamais vraiment comprendre. Pourrait-on faire un point là-dessus ?

    Pour ne pas venir les mains vides j'ai fait un extrait du Démineur, où la matrice sert à produire un effet "bombé".

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    program matrice01;
     
    {$FRAME_WIDTH 400}
    {$FRAME_HEIGHT 400}
     
    uses
      Flash8;
     
    type
      tImage = class(movieClip)
        constructor Create(name: string; x, y: integer);
        procedure Carre(taille: integer);
        procedure Remplissage(couleur: integer);
      end;
     
      tMatrice = class
        matrixType: string;
        x,y,w,h   : double;
        r         : double;
        constructor Create;
      end;
     
    constructor tImage.Create(name: string; x, y: integer);
    begin
      inherited Create(nil, name, _root.GetNextHighestDepth());
      _x := x;
      _y := y;
    end;
     
    procedure tImage.Carre(taille: integer);
    begin
      taille := taille div 2;
      MoveTo(-taille, +taille);
      LineTo(-taille, -taille);
      LineTo(+taille, -taille);
      LineTo(+taille, +taille);
      LineTo(-taille, +taille);
    end;
     
    var
      matrice: tMatrice;
     
    procedure tImage.Remplissage(couleur: integer);
    begin
      Clear;
      LineStyle(0, couleur);
      BeginGradientFill('radial', [$ffffff,couleur], [100,100], [0,255], matrice);
      Carre(300);
      EndFill;
    end;
     
    constructor tMatrice.Create;
    begin
      matrixType := 'box';
      x := -75;
      y := -75;
      w := 150;
      h := 150;
      r := 0;
    end;
     
    var
      i: tImage;
     
    begin
      matrice := tMatrice.Create;
      i := tImage.Create('', 200, 200);
      i.Remplissage($6600FF); { PersianBlue }
    end.


    J'ai remplacé TMatrix par TMatrice : ça fonctionne toujours. Mais j'ai constaté que je ne pouvais pas remplacer matrixType.

    Et pour la procédure BeginGradientFill, je ne vois pas trop non plus comment ça marche. Peut-être qu'il faudrait que je me décide à consulter la documentation ActionScript, comme Paul me l'avait conseillé dès le départ.

  2. #2
    Expert éminent sénior
    alors, premièrement qu'est-ce qu'une matrice ?

    prenons un exemple simple, je veux pouvoir faire des transformations sur un polygone, le tourner, le déplacer, le mettre à l'échelle. Pour cela il me faut des formules mathématiques:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Translation
      x2 := x1 + tx;
      y2 := y1 + ty;
    // Rotation selon l'angle A
      x2 := x1 * cos(A) - y1 * sin(A);
      y2 := - x1 * sin(A) + y1 * cos(A);
    // mise à l'échelle
      x2 := sx * x1;
      y2 := sy * y1;


    maintenant on peut homogénéiser ces formules en facteurs de x et y
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Translation
      x2 := 1 * x1 + 0 * y1 + tx;
      y2 := 0 * x1 + 1 * y1 + ty;
    // Rotation selon l'angle A
      x2 := x1 * cos(A) - y1 * sin(A) + 0;
      y2 := - x1 * sin(A) + y1 * cos(A) + 0;
    // mise à l'échelle
      x2 := sx * x1 + 0 * y1 + 0;
      y2 := 0 * x1 + sy * y1 + 0;


    maintenant en plaçant les facteurs dans un tableau on obtient ceci
      T = [1, 0, tx,
            0, 1, ty];
      R = [cos(A), -sin(A), 0,
            -sin(A), cos(A), 0];
      S = [sx, 0, 0,
           0, sy, 0];
    
    cette notation en tableau c'est ce qu'on appelle une matrice

    mais à quoi ça sert de faire ça ?

    1) on peut appliquer facilement une matrice à un point sans savoir ce qu'elle fait (rotation, translation, ou mise à l'échelle), c'est juste une matrice
    2) et c'est le plus important, il est possible de faire des opérations sur les matrices ! c'est à dire qu'en lieu d'appliquer la matrice de rotation à tous les points, puis la matrice de translation à tous les points, on va pouvoir combiner les deux matrices dans une nouvelle matrice qui fera à la fois la rotation et la translation pour l'appliquer une seule fois à l'ensemble des points.

    Notez cependant que l'ordre de combinaison des matrices à de l'importance, si j'avance de 3 pas et que je tourne à 90°, je n'arrive pas au même endroit que si je tourne avant d'avancer.

    Maintenant, l'objet TMatrix de FlashMine, son nom n'a aucune importance, c'est juste un choix du programmeur. Par contre ses membres sont ceux attendus par Flash. Il suffit de regarder la document (et oui ) pour voir que 'matrixType' définie le type de matrice...c'est une des trois formes possibles du paramètre Matrix (cf doc Adobe). Notez cependant que Adobe recommande l'usage de l'objet flash.geom.Matrix (que je n'avais pas encore ajouté à l'unité Flash8 à l'époque de cet exemple).
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Merci pour la leçon, Paul ! J'y vois déjà plus clair. J'ai refait mon premier exemple.

    Je crois que la discussion est résolue.