ROTATION D'UNE IMAGE

cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004 - 1 nov. 2002 à 14:37
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013 - 26 août 2008 à 22:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12197-rotation-d-une-image

blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
26 août 2008 à 22:47
Voici un morceau de mon code (j'avais 2 procédures : 1 à la barbare - utilisation de ScanLine) et l'autre par le GDI (utilisation de TransFormWorld)... Cette fonctionnalité (TransformWorld) permets, entre autres, d'appliquer des transformations mathématiques issues d'une matrice (TXForm)
sur chaque points affichés, après appel de la fonction !

Ici, un changement de repère (pour placer le centre de la rotation), puis une rotation...

Paramètres :

var _object:TBitmap;
const _value:TDegrees;

Code :
Result doit être un TBitmap...

procedure DoItUsingGDI;

var _hdc: THandle;
_cosinus:TReal;
_sinus:TReal;
_xform:TXForm;

begin
_hdc:= Result.Canvas.Handle;

SetGraphicsMode(_hdc, GM_ADVANCED);
SetMapMode(_hdc, MM_TEXT);

// Set Origin
_xform.eM11:= 1.0;
_xform.eM12:= 0.0;
_xform.eM21:= 0.0;
_xform.eM22:= 1.0;
_xform.eDx := -_object.Width * 0.5;
_xform.eDy := -_object.Height * 0.5;

Windows.SetWorldTransform( _hdc,
_xform
);

// Set roll
_cosinus := TAngle.DoCosinus(-_value);
_sinus := TAngle.DoSinus(-_value);

_xform.eM11:= _cosinus;
_xform.eM12:= _sinus;
_xform.eM21:= -_sinus;
_xform.eM22:= _cosinus;
_xform.eDx := Result.Width * 0.5;
_xform.eDy := Result.Height * 0.5;

Windows.ModifyWorldTransform( _hdc,
_xform,
MWT_RIGHTMULTIPLY
);

// Draw
Result.Canvas.Draw( 0, 0, _object);

// Reset
_xform.eM11:= 1.0;
_xform.eM12:= 0.0;
_xform.eM21:= 0.0;
_xform.eM22:= 1.0;
_xform.eDx := 0;
_xform.eDy := 0;

Windows.SetWorldTransform( _hdc,
_xform
);
end;

Tu devrais pouvoir t'en sortir !
damanix Messages postés 20 Date d'inscription samedi 7 septembre 2002 Statut Membre Dernière intervention 2 novembre 2002
2 nov. 2002 à 01:37
l'inverse de la tangente c pas
ArcTan(X: Extended)
???
Dx.
balgrim Messages postés 52 Date d'inscription vendredi 26 avril 2002 Statut Membre Dernière intervention 28 octobre 2003
1 nov. 2002 à 20:51
Ouais!!! C exactement ce que je cherchais, je v pouvoir avancé :p
Merci pour tous, et j'espere pouvoir balancé mon moteur sur le site d'ici peu ;)
Sinon pour DirectX je m'is connais pas trop, mais comme pour l'openGL, je trouve que c trop complikée (je comprend pas, j'accroche pas). De plus g po envie d'etre dependant de Micro$oft (directX ne tourne pas sous unix). Enfin bon sinon tu saurais pas par hasard comment faire l'inverse de tangeante (tan) Merci pour tout!!!

Balgrim.
cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004
1 nov. 2002 à 14:37
Tu pourras trouver sur
http://homepages.borland.com/efg2lab/ImageProcessing/RotateScanline.htm
une méthode beaucoup plus performante que la tienne pour faire des rotations de TBitmap. Elle est basée sur TBitmap.ScanLine

Bon courage pour le moteur 2d ...
Je te conseille d'utiliser DirectX, tu obtiendras des performances bien meilleures encore.
a+
Rejoignez-nous