任意角度图片旋转

时间:2010-04-28 16:00:22  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读: 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); floa...
  正文: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<DestBitmapWidth;x++)
 {
 for(int y=0;y<DestBitmapHeight;y++)
  {
  int SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine);
  int SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine);
  if(SrcBitmapx>=0&&SrcBitmapx<Source->Width&&SrcBitmapy>=0&&
  SrcBitmapy<Source->Height)
   {
   NewPic->Canvas->Pixels[x][y]=Source->Canvas->Pixels[SrcBitmapx][SrcBitmapy];
   }
  }
 }
}


任意角度图片旋转》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/VC/2010-04-28/13799.html


关键字:

关于《任意角度图片旋转》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td