Rotation d'une image

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 325 fois - Téléchargée 36 fois

Contenu du snippet

voila un ptit algorithme de rotation d'une image pompée d'une source sur vbfrance.com
Il n'est pas optimizée alors g besoin d'aide (2 seconde pour la rotation d'image, et c normalement pour un moteur 2D :s)

Source / Exemple :


function SetImgAngle(angle:integer; source:TBitmap):TBitmap;
var
n:integer;
Largeur,ecart:integer;
pi2:extended;
z:extended;
col_prov,lig_prov:integer;
i,j:integer;
couleur:DWord;
xx,yy,x,y:integer;
//Pour accelerer les chose: variable d'optimization
cz,sz:extended;
czpi,szpi:extended;
begin
n:=source.Width;
Largeur:= source.Width div 2;
result:=TBitmap.create;
result.Height:=300;result.Width:=300;//a changer;
ecart:= trunc((Sqrt(2*Sqr(n)) - n)/2);
pi2:= pi / 2;
z:= 0.01745 * angle;
x:=source.Width div 2;y:=source.Height div 2;
cz:=Cos(z);sz:=Sin(z);
czpi:=Cos(z + pi2);
szpi:=Sin(z + pi2);
For i:= -ecart To n + ecart do begin
    col_prov:= trunc(Largeur + ((i - Largeur) * cz));
    lig_prov:= trunc(Largeur + ((i - Largeur) * sz));
    For j:= -ecart To n + ecart do begin

        xx:=trunc(col_prov + ((j - Largeur) * czpi));
        yy:=trunc(lig_prov + ((j - Largeur) * szpi));
        Couleur:=source.Canvas.Pixels [xx,yy];

        If (Couleur <> -1) And (Couleur <> $FFFFFF) Then begin
            xx:=i + (X - Largeur);
            yy:=j + (Y - Largeur);
            result.Canvas.Pixels[xx,yy]:=Couleur
        end;
    end;
end;
end;

Conclusion :


pour le lancer:
2 images + un scrollbar (par exemple):
image2.picture.Bitmap:=SetImgAngle(scrollbar1.Position,image1.Picture.Bitmap)

A voir également

Ajouter un commentaire Commentaires
Messages postés
234
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2013

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 !
Messages postés
24
Date d'inscription
samedi 7 septembre 2002
Statut
Membre
Dernière intervention
2 novembre 2002

l'inverse de la tangente c pas
ArcTan(X: Extended)
???
Dx.
Messages postés
52
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
28 octobre 2003

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.
Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004

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+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.