IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Composants FMX Delphi Discussion :

[TPATH] Application de transformations


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 607
    Billets dans le blog
    65
    Par défaut [TPATH] Application de transformations
    Bonjour,

    Je tente désormais de travailler sur les transformations d'un PathData. Il existe plusieurs transformations possibles cf. https://developer.mozilla.org/fr/doc...bute/transform

    Si j'en ai plus ou moins réussi certaines (scale, translate,rotate ici) je butte, entre autres, sur matrix

    Nom : Capture.PNG
Affichages : 415
Taille : 22,2 Ko

    mon code
    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
    if Pos('matrix(',transform)>0 then
     begin
    // SVG Theory https://developer.mozilla.org/fr/docs/Web/API/SVGMatrix
    // Beaucoup d'opération graphiques de SVG utilisent des matrices 2x3 de la forme :
    // [a c e]
    // [b d f]
    // laquelle, quand étendue en une matrice 3x3 à des fins d'arithmétique matricielle, devient
    // [a c e]
    // [b d f]
    // [0 0 1]
     
        PS:=Pos('matrix(',transform)+Length('matrix(');
        GetNumbers(Copy(transform,PS,Pos(')',transform,PS)-PS), Numbers);
        var ma : single :=Numbers.Dequeue;
        var mc : Single :=Numbers.Dequeue;
        var me : Single :=Numbers.Dequeue;
        var mb : Single :=Numbers.Dequeue;
        var md : Single :=Numbers.Dequeue;
        var mf : Single :=Numbers.Dequeue;
     
     
        M.m11:=ma;
        M.m12:=mb;
        M.m21:=mc;
        M.m22:=md;
        M.m31:=me;
        M.m32:=mf;
        Cible.Data.ApplyMatrix(M);
     
     end;
    En fait, j'ai essayé beaucoup de combinaisons pour remplir la matrice, c'est loin d'être une évidence parce que peu naturelle, c'est le code qui applique le meilleur angle, mais, ni le déplacement ni l'épaisseur ne sont au rendez-vous !
    Je me goure peut-être complètement avec le remplissage de M.mxx (cela me semble trop beau qu'un TMatrix soit prévu pour l'effet Matrix).

    Des idées ?

  2. #2
    Membre confirmé

    Profil pro
    senior scientist
    Inscrit en
    Mai 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : senior scientist

    Informations forums :
    Inscription : Mai 2003
    Messages : 82
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    // SVG Theory https://developer.mozilla.org/fr/docs/Web/API/SVGMatrix
    // Beaucoup d'opération graphiques de SVG utilisent des matrices 2x3 de la forme :
    // [a c e]
    // [b d f]
    [/CODE]
    Il s'agit, en termes mathématique, de la matrice (2x3) d'une transformation affine dans le plan (2D). Ce type de transformation est un mélange de translation, rotation et dilatation qui conserve le parallélisme (par exemple, un parallélogramme reste un parallélogramme, mais orienté différemment avec des côtés de longueurs différentes). En particulier, la translation est définie dans la colonne [e;f] (e le long de X, f le long de Y). La matrice carrée [a c;b d] définit le reste de la transformation avec, par exemple, le cas particulier [a b;-b a] qui est une rotation avec changement d'échelle.

    La théorie indique que les opérations matricielles ordinaires (matrices 3x3) peuvent être utilisées pour décrire et combiner ces transformations, à condition d'utiliser des coordonnées dites homogènes pour repérer les points 2D. C'est le rôle de l'ajout de la ligne [0 0 1] pour étendre la matrice.
    A mon avis, le remplissage de la matrice (TMatrix) devrait suivre simplement la définition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TMatrix = record
      private
        function Scale(const AFactor: Single): TMatrix;
      public
        class function CreateRotation(const AAngle: Single): TMatrix; static;
    ...
        case Integer of
          0: (M: TMatrixArray;);
          1: (m11, m12, m13: Single;
              m21, m22, m23: Single;
              m31, m32, m33: Single);
      end;
    Un piège possible: la convention de remplissage de la matrice dans Delphi est-elle ''colonne d'abord'' ou ''ligne d'abord'' ?
    C'est à vérifier.
    alx.

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    il manque 1 dans m33

    les matrices c'est en fait relativement simple, j'en parle ici

    la matrice ne fait que reprendre les facteurs de x y (et z en 3D) dans une équation du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type
      TMatrice: array[0..2, 0..3] of Single;
    var
      Matrice: TMatrice;
    begin
      x1 := Matrice[0, 0] * x + Matrice[0, 1] * y + Matrice[0, 2] * z + Matrice[0, 3];
      y1 := Matrice[1, 0] * x + Matrice[1, 1] * y + Matrice[1, 2] * z + Matrice[1, 3];
      z1 := Matrice[2, 0] * x + Matrice[2, 1] * y + Matrice[2, 2] * z + Matrice[2, 3];
    end;
    dans cet exemple, la translation est donc dans Matrix[n, 3] car elle ne dépend pas de x, y ou z

    et la matrice identité ( = pas de transformation) comprend juste des 1 sur la diagonale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      x1 := 1 * X + 0 * y + 0 * z + 0;
      y1 := 0 * X + 1 * y + 0 * z + 0;
      z1 := 0 * X + 0 * y + 1 * z + 0;
      w1 := 0 * X + 0 * y + 0 * z + 1; // la matrice est carrée pour des besoins de combinaisons 3x3 ou 4x4
    pour la 2D on utilise un matrix 3x3, pour la 3D on a besoin d'une matrice 4x4; tu as donc toujours une ligne en plus qui est utilisée par combiner deux matrices et qui DOIT avoir initialement un 1 sur la diagonale pour l'exactitude des calculs
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 607
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par _alx_ Voir le message
    Un piège possible: la convention de remplissage de la matrice dans Delphi est-elle ''colonne d'abord'' ou ''ligne d'abord'' ?
    C'est bien colonne ligne, conforté par l'étude du source joint trouvé dans un dépôt GitHub , source d'origine : Delphi SVG library de Martin Walter.


    J'ai même tenté d'utiliser directement cette unité (en pièce jointe),

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TLoadSVGForm.Transformation(transform: String; Cible: TPath);
    var
         M : TMatrix;
    begin
    M:=ParseTransform(transform);
    Cible.Data.ApplyMatrix(M);
    end;
    Nom : Capture.PNG
Affichages : 586
Taille : 4,2 Ko

    avec un résultat guère plus correct, cela implique que ma manière de faire pose un souci
    Fichiers attachés Fichiers attachés

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    tu as un projet exemple complet ? car je ne vois rien de choquant dans l'unité mais c'est un peu pénible de créer un cas de test

    la partie SKIA n'est pas nécessaire si c'est plus simple...

    d'ailleurs, le problème n'est-il pas plutôt lié au rendu ? ton rectangle rouge m'a l'air écrasé dans ses dimensions d'origine...j'ai eu le même problème en 3D avec Perseverance jusqu'à ce que je change le WrapMode
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé

    Profil pro
    senior scientist
    Inscrit en
    Mai 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : senior scientist

    Informations forums :
    Inscription : Mai 2003
    Messages : 82
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    C'est bien colonne ligne, conforté par l'étude du source joint trouvé dans un dépôt GitHub , source d'origine : Delphi SVG library de Martin Walter.


    Nom : Capture.PNG
Affichages : 586
Taille : 4,2 Ko

    avec un résultat guère plus correct, cela implique que ma manière de faire pose un souci
    Il manque clairement la translation (3ème colonne de la matrice)
    Dans un précédent message Paul Toth a remarqué que vous aviez peut-être oublié de mettre m33 à 1 dans votre code: cela pourrait expliquer.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 607
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par _alx_ Voir le message
    Il manque clairement la translation (3ème colonne de la matrice)
    Dans un précédent message Paul Toth a remarqué que vous aviez peut-être oublié de mettre m33 à 1 dans votre code: cela pourrait expliquer.
    Je l'ai fait, mais sans changement,

    jusqu'à ce que je change le WrapMode
    oui, j'y pense en dernière "cartouche"

    tu as un projet exemple complet ? car je ne vois rien de choquant dans l'unité mais c'est un peu pénible de créer un cas de test
    je vais en écrire un moins complexe

Discussions similaires

  1. [CSS 3] Application de transform:scale(x) sur une <li> <a>
    Par mickasou dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 22/01/2019, 18h03
  2. Réponses: 5
    Dernier message: 03/05/2015, 03h24
  3. Erreur d'application de transformation
    Par spelya dans le forum Installation
    Réponses: 0
    Dernier message: 10/03/2009, 21h47
  4. Réponses: 5
    Dernier message: 05/04/2007, 10h30
  5. Transformation d'une application en Applet
    Par Alex2065 dans le forum Applets
    Réponses: 2
    Dernier message: 07/02/2007, 14h23

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