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 [Flash Pascal]


Sujet :

Flash Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 507
    Points : 12 236
    Points
    12 236
    Billets dans le blog
    8
    Par défaut 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.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    7 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 7 412
    Points : 24 289
    Points
    24 289
    Par défaut
    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

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 507
    Points : 12 236
    Points
    12 236
    Billets dans le blog
    8
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/12/2005, 11h27
  2. Opérations sur les matrices...
    Par aokiseiichiro dans le forum C
    Réponses: 32
    Dernier message: 28/07/2005, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo