UDF > WinAPIEx > GDI > Coordinate & Transform >


_WinAPI_CreateTransform

Crée la structure $tagXFORM qui caractérise une transformation de l'espace universel dans l'espace page

#include <WinAPIGdi.au3>
_WinAPI_CreateTransform ( [$nM11 = 1 [, $nM12 = 0 [, $nM21 = 0 [, $nM22 = 1 [, $nDX = 0 [, $nDY = 0]]]]]] )

Paramètres

Les paramètres à passer représentent les coefficients de la matrice d'une transformation linéaire:
    | M11 M21 |
    | M12 M22 |
ainsi que les deux composantes d'un vecteur de translation (Dx,Dy).

$nM11 [optionnel] Coefficient de la matrice selon la transformation à définir:
Rotation - Cosinus de l'angle de rotation.
Mise à l'échelle - Coefficient horizontal de mise à l'échelle.
Transvection - Non utilisé.
Réflexion - Composante horizontale.
$nM12 [optionnel] Coefficient de la matrice selon la transformation à définir:
Rotation - Sinus de l'angle de rotation.
Mise à l'échelle - Non utilisé.
Transvection - Rapport de proportionnalité horizontale.
Réflexion - Non utilisé.
$nM21 [optionnel] Coefficient de la matrice selon la transformation à définir:
Rotation - Opposé du sinus de l'angle de rotation.
Mise à l'échelle - Non utilisé.
Transvection - Rapport de proportionnalité verticale.
Réflexion - Non utilisé.
$nM22 [optionnel] Coefficient de la matrice selon la transformation à définir:
Rotation - Cosinus de l'angle de rotation.
Mise à l'échelle - Coefficient vertical de mise à l'échelle.
Transvection - Non utilisé.
Réflexion - Composante verticale.
$nDx [optionnel] La composante horizontale de la translation, en unités logiques. Par défaut, 0.
$nDy [optionnel] La composante verticale de la translation, en unités logiques. Par défaut, 0.

Valeur de retour

Retourne la structure $tagXFORM qui contient les données de la transformation.

Remarques

Une rotation plane est une transformation qui fait "pivoter" l'objet autour d'un point fixe appelé centre de rotation. Vous pouvez faire pivoter l'objet de n'importe quel angle. La rotation par un angle positif pivote l'objet dans le sens inverse des aiguilles d'une montre, tandis que la rotation par un angle négatif pivote l'objet dans le sens des aiguilles d'une montre. Par exemple, la rotation de centre O (origine) et d'angle 10° a pour matrice:
    | cos(10°)  -sin(10°) |
    | sin(10°)   cos(10°) |

Une mise à l'échelle est la composée de deux transformations élémentaires:
- une affinité d'axe Ox, de base Oy, et de rapport k1 (non nul) qui agrandit ou diminue les objets dans le sens Ox suivant que |k1| est supérieur ou inférieur à 1
- une affinité d'axe Oy, de base Ox, et de rapport k2 (non nul) qui agrandit ou diminue les objets dans le sens Oy suivant que |k2| est supérieur ou inférieur à 1.
Si les rapports sont égaux, vous obtenez une homothétie qui ne déforme pas les objets, sinon les angles ne sont pas conservés. Sa matrice est:
    | k1 0  |
    | 0  k2 |

Une transvection est la composée:
- d'une transformation qui déplace chaque point dans la direction Ox, d'une quantité proportionnelle à sa distance signée à l'axe des y;
- d'une transformation qui déplace chaque point dans la direction Oy, d'une quantité proportionnelle à sa distance signée à l'axe des x.
Un exemple est la tranformation qui transforme tout point de coordonnées (x,y) en un point de coordonnées (x+2y,3x+y), les rapports de proportionnalité sont k1=2 et k2=3, sa matrice est:
    | 1  k1 |
    | k2  1 |

Une réflexion (ou symétrie-droite, à ne pas confondre avec symétrie centrale qui est une rotation d'angle 180°) transforme un objet en son image miroir par rapport à une droite donnée. Par exemples, la symétrie par rapport à Ox transforme (x, y) en (x, -y), et la symétrie par rapport à Oy transforme (x, y) en (-x, y). Les matrices respectives sont:
    | 1  0 |     | -1 0 |
    | 0 -1 |     |  0 1 |

Exemple

#include <APIGdiConstants.au3>
#include <GUIConstantsEx.au3>
#include <SendMessage.au3>
#include <StaticConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIHObj.au3>
#include <WinAPIMisc.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

Global Const $PI = 4 * ATan(1)

; Crée une GUI
Local $hForm = GUICreate('Test '& StringReplace(@ScriptName, '.au3', '()'), 340, 340)
Local $idPic = GUICtrlCreatePic('', 0, 0, 320, 320)
Local $hPic = GUICtrlGetHandle($idPic)

; Crée un bitmap
Local $hDC = _WinAPI_GetDC($hPic)
Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
Local $hBitmap = _WinAPI_CreateCompatibleBitmapEx($hDC, 340, 340, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_3DFACE)))
Local $hMemSv = _WinAPI_SelectObject($hMemDC, $hBitmap)

; Définit le mode graphique avancé pour être en mesure de définir une transformation universelle 
_WinAPI_SetGraphicsMode($hMemDC, $GM_ADVANCED)

; Créez une matrice de rotation de 5 degrés
Local $nAngle = $PI / 36
Local $iXc = 170
Local $iYc = 170
Local $nM11 = Cos($nAngle)
Local $nM12 = Sin($nAngle)
Local $nM21 = -$nM12
Local $nM22 = $nM11
Local $nDx = $iXc * (1 - Cos($nAngle)) + $iYc * Sin($nAngle)
Local $nDy = $iYc * (1 - Cos($nAngle)) - $iXc * Sin($nAngle)
Local $tXFORM = _WinAPI_CreateTransform($nM11, $nM12, $nM21, $nM22, $nDx, $nDy)

; Dessine des ellipses par rotation
Local $hBrush = _WinAPI_SelectObject($hMemDC, _WinAPI_GetStockObject($NULL_BRUSH))
Local $hPen = _WinAPI_SelectObject($hMemDC, _WinAPI_GetStockObject($DC_PEN))
_WinAPI_SetDCPenColor($hMemDC, 0xDD0000)
Local $tRECT = _WinAPI_CreateRect($iXc - 150, $iYc - 40, $iXc + 150, $iYc + 40)
For $i = 0 To 350 Step 5
    _WinAPI_ModifyWorldTransform($hMemDC, $tXFORM, $MWT_LEFTMULTIPLY)
    _WinAPI_Ellipse($hMemDC, $tRECT)
Next

; Libère les objets
_WinAPI_ReleaseDC($hPic, $hDC)
_WinAPI_SelectObject($hMemDC, $hBrush)
_WinAPI_SelectObject($hMemDC, $hPen)
_WinAPI_SelectObject($hMemDC, $hMemSv)
_WinAPI_DeleteDC($hMemDC)

; Définit le bitmap dans le contrôle Picture
_SendMessage($hPic, $STM_SETIMAGE, 0, $hBitmap)
Local $hObj = _SendMessage($hPic, $STM_GETIMAGE)
If $hObj <> $hBitmap Then
    _WinAPI_DeleteObject($hBitmap)
EndIf

GUISetState(@SW_SHOW)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE