1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #ifndef M_PI
#define M_PI 3.14
#endif
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
void TProjector::rotatePicture(TImage * source, int angle)
{
Graphics::TBitmap *SrcBitmap = source->Picture->Bitmap;
Graphics::TBitmap *DestBitmap= new Graphics::TBitmap;
float radians=(-2*3.1416*angle)/360;
float cosine=(float)cos(radians);
float sine=(float)sin(radians);
float Point1x=(-SrcBitmap->Height*sine);
float Point1y=(SrcBitmap->Height*cosine);
float Point2x=(SrcBitmap->Width*cosine-SrcBitmap->Height*sine);
float Point2y=(SrcBitmap->Height*cosine+SrcBitmap->Width*sine);
float Point3x=(SrcBitmap->Width*cosine);
float Point3y=(SrcBitmap->Width*sine);
float minx=min(0,min(Point1x,min(Point2x,Point3x)));
float miny=min(0,min(Point1y,min(Point2y,Point3y)));
float maxx=max(Point1x,max(Point2x,Point3x));
float maxy=max(Point1y,max(Point2y,Point3y));
int DestBitmapWidth=(int)ceil(fabs(maxx)-minx);
int DestBitmapHeight=(int)ceil(fabs(maxy)-miny);
DestBitmap->Height=DestBitmapHeight;
DestBitmap->Width=DestBitmapWidth;
SetGraphicsMode(DestBitmap->Canvas->Handle,GM_ADVANCED);
XFORM xform;
xform.eM11=cosine;
xform.eM12=-sine;
xform.eM21=sine;
xform.eM22=cosine;
xform.eDx = (float)-minx;
xform.eDy = (float)-miny;
SetWorldTransform(DestBitmap->Canvas->Handle,&xform);
BitBlt(DestBitmap->Canvas->Handle,
0,
0,
DestBitmap->Width,
DestBitmap->Height,
SrcBitmap->Canvas->Handle,
0,
0,
SRCCOPY);
Image15->Picture->Bitmap = DestBitmap;
delete DestBitmap;
} |
Partager