龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

任意角度图片旋转

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
void S_PicXZ(Graphics::TBitmap *Source,Graphics::TBitmap *NewPic,int angle)// { if(angle>180)angle=360-angle; if(angle float radians=(2*3.1416*angle)/360; float cosine=(float)cos(radians); float sine=(float)sin(radians); float Point1x=(-Sou

  void S_PicXZ(Graphics::TBitmap *Source,Graphics::TBitmap *NewPic,int angle)//

  

{

  

if(angle>180)angle=360-angle;

  

if(angle<-180)angle=360+angle;

  

  

float radians=(2*3.1416*angle)/360;

  

float cosine=(float)cos(radians);

  

float sine=(float)sin(radians);

  

float Point1x=(-Source->Height*sine);

  

float Point1y=(Source->Height*cosine);

  

float Point2x=(Source->Width*cosine-Source->Height*sine);

  

float Point2y=(Source->Height*cosine+Source->Width*sine);

  

float Point3x=(Source->Width*cosine);

  

float Point3y=(Source->Width*sine);

  

float minx=min((float)0,min(Point1x,min(Point2x,Point3x)));

  

float miny=min((float)0,min(Point1y,min(Point2y,Point3y)));

  

float maxx=max(Point1x,max(Point2x,Point3x));

  

float maxy=max(Point1y,max(Point2y,Point3y));

  

int DestBitmapWidth,DestBitmapHeight;

  

if(angle>90&&angle<180)

  

DestBitmapWidth=(int)ceil(-minx);

  

else

  

DestBitmapWidth=(int)ceil(maxx-minx);

  

  

if(angle>-180&&angle<-90)

  

DestBitmapHeight=(int)ceil(-miny);

  

else

  

DestBitmapHeight=(int)ceil(maxy-miny);

  

  

NewPic->Height=DestBitmapHeight;

  

NewPic->Width=DestBitmapWidth;

  

for(int x=0;x

  

{

  

for(int y=0;y

  

{

  

int SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine);

  

int SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine);

  

if(SrcBitmapx>=0&&SrcBitmapxWidth&&SrcBitmapy>=0&&

  

SrcBitmapyHeight)

  

{

  

NewPic->Canvas->Pixels[x][y]=Source->Canvas->Pixels[SrcBitmapx][SrcBitmapy];

  

}

  

}

  

}

  

}

  

精彩图集

赞助商链接