Partager via


Vue d’ensemble des transformations

Cette rubrique décrit les principes de base des transformations Direct2D et inclut des exemples de différentes transformations. Il contient les parties suivantes :

Qu’est-ce qu’une transformation Direct2D ?

Une transformation spécifie comment mapper les points d’un objet d’un espace de coordonnées à un autre ou d’une position à une autre dans le même espace de coordonnées. Ce mappage est décrit par une matrice de transformation, définie comme une collection de trois lignes avec trois colonnes de valeurs FLOAT, comme indiqué dans le tableau suivant.

     
M11Par défaut : 1,0 M12Par défaut : 0.0 0.0
M21Défaut : 0.0 M22Default : 1.0 0.0
M31OffsetX : 0.0 M32OffsetY : 0,0 1.0

 

Dans cette matrice, les membres M11, M12, M21 et M22 définissent une transformation linéaire qui peut mettre à l’échelle, faire pivoter ou incliner un objet ; les membres OffsetX et OffsetY définissent la translation à appliquer après la transformation linéaire. Pour les transformations affine, les valeurs de la troisième colonne sont toujours 0,0, 0,0 et 1.0.

Étant donné que Direct2D prend uniquement en charge les transformations affine (linéaires), sa matrice de transformation est définie comme une matrice 3 par 2, omettant la troisième colonne de la matrice de transformation précédente. Le tableau suivant montre la disposition de la matrice de transformation Direct2D.

   
M11Par défaut : 1,0 M12Par défaut : 0.0
M21Défaut : 0.0 M22Default : 1.0
M31OffsetX : 0,0 M32OffsetY : 0,0

 

Dans Direct2D, cette matrice 3 par 2 est représentée par la structure D2D1_MATRIX_3X2. Pour simplifier les opérations de matrice courantes, Direct2D fournit également une classe nommée Matrix3x2F, qui est dérivée de la structure D2D1_MATRIX_3X2.

Le constructeur par défaut pour Matrix3x2F laisse l’objet non initialisé. Pour récupérer une matrice d’identité, utilisez Matrix3x2F ::Identity.

Lorsqu’une transformation d’identité est appliquée à un objet, elle ne modifie pas la position, la forme ou la taille de l’objet. Il est similaire à la façon dont la multiplication d’un nombre par 1 ne modifie pas le nombre. En d’autres termes, la transformation d’identité laisse les coordonnées de points seuls et ne déplace pas les points vers une nouvelle position. Toute transformation autre que la transformation d’identité modifie la position, la forme et/ou la taille des objets.

Les transformations sont toutes relatives aux coordonnées et la compréhension de l’espace de coordonnées Direct2D est importante pour comprendre l’utilisation des transformations.

Espace de coordonnées Direct2D

Direct2D utilise un espace de coordonnées gaucher ; autrement dit, les valeurs positives de l’axe des x augmentent à droite et les valeurs positives de l’axe y augmentent vers le bas. Tout sur l’écran est positionné par rapport à l’origine, qui est le point où l’axe x et l’axe y se croisent (0, 0), comme illustré dans l’illustration suivante. Les cibles de rendu Direct2D utilisent cet espace de coordonnées.

illustration de l’axe des x et l’axe des y d’un espace de coordonnées gauches

En manipulant des valeurs dans une matrice de transformation, vous pouvez faire pivoter, mettre à l’échelle, incliner et déplacer (translater) un objet. Par exemple, si vous définissez OffsetX sur 100 et OffsetY sur 200, vous déplacez l’objet vers la droite de 100 pixels et vers le bas de 200 pixels.

Pour afficher l’effet du déplacement de l’objet, vous devez appliquer la transformation de traduction pour afficher des cibles, des pinceaux ou des géométries. L’application d’une transformation aux cibles de rendu affecte l’ensemble de l’écran, tout en appliquant une transformation à un pinceau ou à une géométrie uniquement affecte ce pinceau ou cette géométrie spécifique. Pour créer une matrice de transformation, utilisez la classe Matrix3x2F.

Création de matrices de transformation

Pour la création de transformations de rotation, d’échelle, d’asymétrie et de traduction, la classe Matrix3x2F fournit les méthodes statiques indiquées dans le tableau suivant. La colonne Exemple de la table contient des liens vers les rubriques de procédure qui montrent comment utiliser chaque méthode de transformation.

Méthode Description Exemple Illustration
matrix3x2f::rotate crée une transformation de rotation qui a l’angle et le point central spécifiés. comment faire pivoter un objet illustration d’un carré pivoté de 45 degrés dans le sens des aiguilles d’une montre au centre du carré d’origine
matrix3x2f::scale crée une transformation d’échelle qui a les facteurs d’échelle et le point central spécifiés. comment mettre à l’échelle un objet illustration d’un carré mis à l’échelle de 130 %
matrix3x2f::skew crée une transformation d'inclinaison qui possède les valeurs d'axe x et d'axe y spécifiées ainsi qu'un point central. comment incliner un objet illustration d’un carré incliné de 30 degrés dans le sens inverse des aiguilles d'une montre par rapport à l’axe y
matrix3x2f::translation crée une transformation de traduction et spécifie les déplacements dans la direction de l’axe x et de l’axe y. comment traduire un objet illustration d’un carré déplacé 20 unités le long de l’axe x positif et de 10 unités le long de l’axe y positif

 

Transformations de cible de rendu

Une cible de rendu est une ressource qui hérite de l’interface ID2D1RenderTarget. Il crée des ressources pour dessiner et effectue des opérations de dessin réelles. Il fournit également des méthodes pour transformer l’espace de coordonnées. Vous pouvez appeler la méthode ID2D1RenderTarget ::SetTransform pour appliquer la transformation spécifiée à la cible de rendu. Toutes les opérations de dessin suivantes se produisent dans l’espace transformé.

Pour afficher le contenu, utilisez les méthodes de dessin de la cible de rendu. Avant de commencer le dessin, appelez la méthode BeginDraw. Pour terminer le rendu du contenu, appelez la méthode EndDraw. Pour obtenir un exemple, consultez Comment appliquer plusieurs transformations à un objet.

Transformations de pinceau

Vous pouvez ajuster la transformation sur le pinceau en appelant SetTransform. Pour cette transformation, vous pouvez considérer le pinceau comme un grand morceau de papier et des différentes primitives de rendu (texte, géométrie, rectangle, et ainsi de suite) comme des gabarits. Lorsque vous ajustez la transformation du pinceau, c’est comme si vous glissiez le grand morceau de papier sous le pochoir, sans modifier la position du pochoir lui-même. Vous pouvez utiliser cette technique pour faire passer le texte du jaune au noir dans un espace 3D.

Lorsque la transformation de pinceau est la transformation d’identité, les pinceaux apparaissent dans le même espace de coordonnées que la cible de rendu dans laquelle ils sont dessinés. La transformation de pinceau permet à un appelant de modifier la manière dont les coordonnées de pinceau sont mappées dans cet espace.

L’espace de pinceau est spécifié différemment dans Direct2D que dans Windows Presentation Foundation (WPF). Dans Direct2D, l’espace de pinceau n’est pas relatif à l’objet dessiné, mais plutôt au système de coordonnées actuel de la cible de rendu, transformé par la transformation de pinceau, s’il en existe un. Pour que le pinceau remplisse un objet comme c’est le cas dans WPF, vous devez transposer l’origine de l’espace de pinceau dans le coin supérieur gauche du cadre englobant de l’objet, puis mettre à l’échelle l’espace de pinceau afin que la vignette de base remplisse le cadre englobant de l’objet.

Pour plus d’informations sur les transformations de pinceau, consultez Vue d’ensemble des pinceaux Direct2D.

Transformations géométriques

Lorsque vous mettez à l'échelle, déplacez, traduisez ou inclinez des géométries, vous pouvez appliquer directement une transformation à une géométrie spécifique, plutôt qu'à une transformation de cible de rendu qui affecterait l'écran entier. Une transformation de cible de rendu affecte généralement le contour et le remplissage d’une géométrie. En revanche, une transformation géométrique affecte seulement le remplissage d’une géométrie, car elle est appliquée avant que la géométrie ne soit tracée.

Note

À partir de Windows 8, la transformation du monde n’affecte pas le trait si vous définissez le type de trait sur D2D1_STROKE_TRANSFORM_TYPE_FIXED ou D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE.

 

Vous pouvez ajuster la transformation sur une géométrie en appelant ID2D1Factory ::CreateTransformedGeometry pour créer un objet ID2D1TransformedGeometry. Pour plus d’informations sur les transformations géométriques, consultez Vue d’ensemble des géométries Direct2D.

Comment une transformation de cible de rendu affecte les clips

La transformation sur une cible de rendu affecte la façon dont le cadre englobant d’un clip aligné sur l’axe est calculé. Lorsque le PushAxisAlignedClip est appelé, le paramètre clipRect est transformé par la transformation du monde en cours appliquée à la cible de rendu. Une fois la transformation appliquée au clipRect , la zone englobante alignée sur l’axe pour le clipRect est calculée. Pour plus d’efficacité, le contenu est découpé dans ce cadre englobant aligné sur l’axe et non dans le clipRect d’origine qui est transmis. Les diagrammes suivants montrent comment une transformation de rotation est appliquée à la cible de rendu, au clipRect résultant et à un cadre englobant aligné sur l’axe calculé.

  1. Supposons que le rectangle de l’illustration suivante est une cible de rendu alignée sur les pixels d’écran.

    illustration d’un rectangle (cible de rendu)

  2. Appliquez une transformation de rotation à la cible de rendu. Dans l’illustration suivante, le rectangle noir représente la cible de rendu d’origine et le rectangle rouge en pointillés représente la cible de rendu transformée.

    illustration du rectangle d’origine et d’un rectangle pivoté (cible de rendu transformée)

  3. Une fois que PushAxisAlignedClip est appelé, la transformation de rotation est appliquée au clipRect. Dans l’illustration suivante, le rectangle bleu représente le clipRect transformé.

    illustration d’un rectangle bleu plus petit (cliprect) à l’intérieur du rectangle pivoté (cible de rendu transformée)

  4. Le cadre englobant aligné sur l’axe est calculé. Dans l’illustration suivante, le rectangle en pointillés verts représente le cadre englobant. Tout le contenu est limité à ce cadre englobant aligné sur les axes.

    Illustration d’un cadre englobant vert sur le petit rectangle bleu (cliprect)

Résumé

Direct2D facilite la transformation d’objets bidimensionnels avec des espaces de coordonnées simplifiés et des classes associées. En utilisant différents types de transformations, vous pouvez translater, faire pivoter, incliner et mettre à l’échelle vos objets pour obtenir de nombreux effets visuels impressionnants.

Référence Direct2D