begin process at 2010 02 09 23:17:57
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > ROTATION D'UNE IMAGE

ROTATION D'UNE IMAGE


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Niveau :Expert Date de création :01/11/2002 Date de mise à jour :01/11/2002 13:57:31 Vu :6 628

Auteur : balgrim

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

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

  • 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;
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(scrol lbar1.Position,image1.Picture.Bitmap)


 Sources du même auteur

CALCULER UNE OPERATION PRESENTE DANS UNE STRING (GESTION DES...
Source avec Zip FONDU ENTRE 2 BITMAP(TUTO SCANLINE)
Source avec Zip MOTEUR 2D (VERSION FINALISÉE)
DROLE DE TRUC (JL'AI PAS FAIT EXPRÉS!!!)
RANGEMENT D'UN TABLEAU DYNAMIQUE

 Sources de la même categorie

Source avec Zip Source avec une capture EFFET VITRE ET THUMBNAILS SOUS VISTA par Bacterius
Source avec Zip Source avec une capture ANAGLYPHEUR OU COMMENT VOIR EN RELIEF LES STÉRÉOSCOPES ANCES... par jfs59
Source avec Zip Source avec une capture DÉFORMER UNE IMAGE AUX DIMENSIONS D'UN QUADRANGLE QUELCONQUE... par FFCAST
Source avec Zip Source avec une capture THREAD ET BITMAP (DESSIN AU CRAYON) par barbichette
Source avec Zip Source avec une capture ÉCRAN DE VEILLE FEU D'ARTIFICE par barbichette

Commentaires et avis

Commentaire de bgK le 01/11/2002 14:37:32

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+

Commentaire de balgrim le 01/11/2002 20:51:45

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.

Commentaire de damanix le 02/11/2002 01:37:23

l'inverse de la tangente c pas
ArcTan(X: Extended)
???
Dx.

Commentaire de blueperfect le 26/08/2008 22:47:44

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 !

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,265 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales