PureBasic
& GDI+ 1.0
Systèmes de coordonnées GDI+
Systèmes de coordonnées |
GDI+ utilise trois systèmes ou espaces de coordonnées :
- Les coordonnées world (World coordinates) ou coordonnées universelles.
- Les coordonnées de page (Page coordinates).
- Les coordonnées device (Device coordinates) ou coordonnées de périphérique.
Par défaut, GDI+ utilise pour ces ces trois systèmes de coordonnées, une position zéro (x=0,y=0) se trouvant dans le coin supérieur gauche de la surface à dessiner.
Les coordonnées universelles (world coordinates) sont les coordonnées que vous passez aux fonctions, par exemple les coordonnées d'une ligne. Ce mode n'est pas lié à la réalité de l'affichage ou de l'impression.
Les coordonnées de page se réfèrent au système de coordonnées utilisé par une surface de dessin, comme par exemple une fenêtre ou une ImageGadget en PureBasic. En règle général, il s'agit de la zone client mais on peut dessiner sur la zone non client.
Les coordonnées de périphérique sont les coordonnées utilisées par le périphérique physique sur lequel on va dessiner, tel qu'un écran ou une imprimante.
Lorsque l'on utilise la fonction GdipDrawLineI(*graphics, *pen, x1, y1, x2, y2), les points x1, y1, x2, y2 passés à cette fonction se trouvent dans l'espace de coordonnées universelles. Avant que GDI+ ne puisse tracer la ligne à l'écran, les coordonnées subissent une série de transformations.
Par défaut, il n'y a aucune transformation et on peut considérer pour un travail a l'écran par exemple. que les coordonnées sont exprimées en pixels.
Mais les transformations peuvent être appliquées par le programmeurs ou par GDI+.
Une des transformations, appelée transformation universelle, convertit des coordonnées universelles en coordonnées de page
Une autre transformation, appelée transformation de page, convertit les coordonnées de page en coordonnées de périphérique.On peut schématiser le cheminement de ces transformations avec le dessin suivant :
Gdi+ permet de définir les coordonnées passées aux fonctions sous la forme de nombres entiers ou de nombres réels (simple précision). Beaucoup de fonctions admettent en paramètres les nombres entiers ou réels, mais il s'agit bien de fonctions différentes. Les fonctions se terminant par un I utilisent des nombres entiers.
La fonction GdipDrawLineI(*graphics, *pen, x1, y1, x2, y2) a les paramètres x1, y1, x2, y2 qui sont des nombres entiers.
La fonction GdipDrawLine(*graphics, *pen, x1, y1, x2, y2) a les paramètres x1, y1, x2, y2 qui sont des nombres réels.
Selon les fonctions, Les coordonnées peuvent être transmises par des valeurs de type Point, PointF, Rect et RectF.
Avec GDI+, on dessine principalement sur un objet appelé graphic. Le programmeur peut contrôler ce graphique avec plusieurs fonctions.
Transformations et systèmes de coordonnées
Si on souhaite dessiner à partir de coordonnées d'origine différente de x=0, y=0, il faut appliquer une translation en x et y sachant que l'on peut avoir une translation différente pour x et y.
La fonction GdipTranslateWorldTransform(*graphics, dx.f, dy.f, order.l) permet d'introduire cette translation (reportez-vous à la fonction pour le paramètre order).
Avec cete fonction, la translation s'applique à tous les objets du graphique.
L'exemple utilise un graphique à partir du Hdc de la fenêtre.
Une première ellipse est dessinée en rouge à la position x=0 et y = 0 sans introduire de translation.
Ensuite, on applique au graphique une translation en x de 100 et y de 80.
Une seconde ellipse est dessinée en noir à la position x=0 et y = 0. Cette ellipse est réellement positionnée en x = 100 et y = 80 du fait de la translation.Puisque l'on a pas modifié l'unité du graphique, les valeurs sont en pixels.
Voici ce que donne l'exemple de translation :
.
Les coordonnées des points définissant l'ellipse (l'ellipse est définie par les coordonnées du rectangle qui l'englobe) dans les trois espaces de coordonnées sont comme ceci :
World 0, 0, 200, 80 Page 100, 80, 200, 80 Device 100, 80, 200, 80 Puisque l'unité de mesure est le pixel, les coordonnées device sont identiques aux coordonnées de page. Si vous utilisez une unité de mesure différente du pixel (par exemple le pouces (inch)), alors les coordonnées device seront différentes des coordonnées de page.
Les fonctions GdipTransformPoints() et GdipTransformPointsI() permettent de convertir un tableau de points d'un espace de coordonnée à un autre (la 1ère fonction pour les coordonnées en réels, la seconde pour les nombres entiers).
Les fonctions GdipGetPageUnit(), GdipSetPageUnit(), GdipGetPageScale() et GdipSetPageScale() permettent de manipuler les transformations de page. Deux fonctions en lecture seule, GdipGetDpiX() et GdipGetDpiY(), permettent d'examiner les points par pouce horizontaux et verticaux du périphérique d'affichage.
Vous pouvez utiliser la fonction GdipSetPageUnit() pour spécifier une unité de mesure voulue au graphique, par exemple le millimètre au lieu du pixel (unité par défaut pour l'écran). Toutes les coordonnées seront seront transcrites en millimètre quel que soit le périphérique de sortie.N'oubliez pas que les pen (par exemple) ont une unité qui peut être différente de celle du graphique, les résultats peuvent aussi varier en fonction du pen!
Il est également possible de modifier l'échelle du graphique.
La fonction GdipSetPageScale() permet de définir le facteur de mise à l'échelle pour la transformation de page du graphique.Les transformations géométriques :
Il est possible d'effectuer des transformations géométriques sur le graphique (la translation (translate), la mise à l'échelle (scale), la rotation (rotate)). Nous avons abordé les deux premières (Gdi+ utilise des matrice pour réaliser les opérations).La fonction GdipRotateWorldTransform() permet de faire une rotation angulaire du graphique avec un angle exprimé en degrés.
Les différentes fonctions vues ci-dessus permettent de s'affranchir de l'utilisation directe des matrices. Ces fonctions s'appliquent à l'ensemble du graphique et par conséquence à tous les objets qu'il contient.
Gdi+ permet d'appliquer des transformations géométriques sur un objet et de nombreux objets possèdent des fonctions de transformations simples qui ne s'appliquent qu'à eux-même.
- La transformation est dite locale lorsqu'elle n'affecte qu'un objet en particulier, par exemple une brush, un texte, une image etc. L'effet n'est pas appliqué au graphique complet.
- La transformation est dite globale lorsqu'elle affecte le graphique et tous les objets qu'il contient.
- La transformation est dite composite lorsqu'il s'agit de plusieurs transformations globales enchaînées.