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

C# Discussion :

Application des transformations "scale" et "translate" à une matrix


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Par défaut Application des transformations "scale" et "translate" à une matrix
    Bonjour,

    Je tente actuellement de porter la fonction suivante - écrire en Java ou swift - à l'aide de C#, dans une bibliothèque Windows Phone :

    Voici le code Java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public Matrix zoom(float scaleX, float scaleY, float x, float y) 
        {
         final Matrix save = new Matrix();
         save.set(anotherMatrix);
         save.postScale(scaleX, scaleY, x, y);
         return save;
        }
    et le code swift

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public func zoom(#scaleX: CGFloat, scaleY: CGFloat, x: CGFloat, y: CGFloat) -> CGAffineTransform
        {
          var matrix = CGAffineTransformTranslate(_touchMatrix, x, y);
          matrix = CGAffineTransformScale(matrix, scaleX, scaleY);
          matrix = CGAffineTransformTranslate(matrix, -x, -y);
          return matrix;
        }
    En C#, dans un univers Windows Phone, je possède bien les classes suivantes :

    • System.Windows.Media.Matrix
    • System.Windows.Media.TranslateTransform
    • System.Windows.Media.ScaleTransform


    Mais... la méthode Transform des classes TranslateTransform et ScaleTransform fonctionne avec des objets Point et non Matrix.

    Comment puis-je alors migrer le code et appliquer les transformations à ma matrice ?

    A noter qu'une classe matrice existe aussi dans l'espace de nom XNA et cette classe présente bien des méthode CreateScale et CreateTranslation. Mais XNA n'est-il pas déprécié ? Quelle classe Matrix dois-je alors utiliser pour arriver à mes fins ?

    Merci d'avance pour votre aide !

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    En C#, dans un univers Windows Phone, je possède bien les classes suivantes :

    •System.Windows.Media.Matrix
    •System.Windows.Media.TranslateTransform
    •System.Windows.Media.ScaleTransform
    Toutes utiles et sans ambiguite ...

    Ne connaissant pas l'api java,mais bien l'api wpf,il faut distinguer 2 choses:
    1/les descendants du class Transform (qui descend lui-meme de DependencyObject analogue au Object en winform).
    - Translate ,Rotate ,Scale etc et leurs homologues 3D crees pour gerer le Binding et l'Animation et munis de props de dependances "ad hoc"....
    Ils encapsulent un vrai STRUCTURE Matrix AFFINE dans leur prop Value (qui n'est pas un dependency mais un "vulgaire" matrix affine 2d ou 3d)... Que designe le code swift par CGAffineXXXXX...


    -le class MatrixTransform (et MatrixTransform3d) herite de Transform mais qui permet de personnaliser un Transform "custom eventuellement NON AFFINE" si les transforms affines suscitees ne suffisent pas..
    Supporte Binding & Animation...

    2/les STRUCTURES Matrix AFFINES(et Matrix3D "homogene") proprement qui sont les matrices 2d ou 3d tout court...

    A vue de nez ce sont des Matrix qu'il faut extraire de la prop Value d'un Transform Affine(ce qui evite des erreurs de mathematique) ....

    comme ceci dans le cas du fun zoom qui renvoie un Matrix :
    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
     
    class Class1
        {
     
            //public func zoom(#scaleX: CGFloat, scaleY: CGFloat, x: CGFloat, y: CGFloat) -> CGAffineTransform
            //{
            //  var matrix = CGAffineTransformTranslate(_touchMatrix, x, y);
            //  matrix = CGAffineTransformScale(matrix, scaleX, scaleY);
            //  matrix = CGAffineTransformTranslate(matrix, -x, -y);
            //  return matrix;
            //}
     
            // Cette function est  une serie de multiplication de Matrix AFFINES qui sont definies 
            // et GARANTIES COMME TELLES en WPF si on les "grabbe" à partir des TRANSFORMATIONS CORRESPONDANTES
            private Matrix _touchMatrix;
            public Matrix zoom(double scaleX, double scaleY ,double x, double y) //renvoi un matrix GARANTI AFFINE
            {
                //CGAffineTransformTranslate(_touchMatrix, x, y) multiple le matrix _touchMatrix par  le matrix de Translation ...
     
                TranslateTransform tt1 = new TranslateTransform(x,y);
                Matrix matrix=_touchMatrix* tt1.Value;
     
                ScaleTransform sc=new ScaleTransform(scaleX, scaleY);
                matrix = matrix *sc.Value;
     
                TranslateTransform tt2 = new TranslateTransform(-x,-y);
                matrix =matrix*tt2.Value ;
                return matrix;
            }
     
        }
    En effet toute serie d'operations sur des matrix AFFINES renvoie un matrix AFFINE...
    bon code...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Par défaut
    Bonjour,

    Je te remercie beaucoup pour cette explication complète. Je regarde tout ça plus en détail

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Par défaut
    Bonjour,

    Donc Finalement, en appliquant le code à Windows Phone, voici ce que ça devrait donner :
    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
    var tt1 = new TranslateTransform();
          tt1.X = x;
          tt1.Y = y;
     
          var tt2 = new TranslateTransform();
          tt2.X = -x;
          tt2.Y = -y;
     
          var scaleTransform = new ScaleTransform();
          scaleTransform.ScaleX = scaleX;
          scaleTransform.ScaleY = scaleY;
     
          var transformGroup = new TransformGroup();
          transformGroup.Children.Add(tt1);
          transformGroup.Children.Add(scaleTransform);
          transformGroup.Children.Add(tt2);
     
          return matrixTouch * transformGroup.Value;
    Le problème c'est que la dernière ligne ne fonctionne pas car l'opérateur "*" n'est pas défini pour l'objet `Matrix`. Suis-je obligé de faire la multiplication à la main ? Je n'ai pas trouvé de méthode permettant de faire la multiplication en .NET pour Windows Phone.

    Une idée ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Par défaut
    Ajouter une semble être une bonne solution

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Tu ne peux pas mettre une variable de portee class dans un return...car à la sortie du function tout ce qui est dans le function est dispose ....detruit !!!
    Mais tu peux utilise la valeur actuelle de cette variable dans le function ....
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
     
    namespace WpfArcData
    {
        /// <summary>
        /// Logique d'interaction pour Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
            private Matrix touchMatrix = Matrix.Identity;//on l'initialise par exemple ou whatever you want
            public Matrix zoom2(double scaleX, double scaleY, double x, double y) //renvoi un matrix AFFINE
            {
     
                var tt1 = new TranslateTransform();
                tt1.X = x;
                tt1.Y = y;
     
                var tt2 = new TranslateTransform();
                tt2.X = -x;
                tt2.Y = -y;
     
                var scaleTransform = new ScaleTransform();
                scaleTransform.ScaleX = scaleX;
                scaleTransform.ScaleY = scaleY;
     
                var transformGroup = new TransformGroup();
                transformGroup.Children.Add(tt1);
                transformGroup.Children.Add(scaleTransform);
                transformGroup.Children.Add(tt2);
                Matrix m = touchMatrix * transformGroup.Value;
                return m;
            }
        }
    }
    bon code...

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

Discussions similaires

  1. Transformation inattendue de mes apostrophes en simple-quote
    Par puresprit dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/06/2015, 15h56

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