码迷,mamicode.com
首页 > 其他好文 > 详细

任意角度图片旋转

时间:2016-10-31 11:01:06      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:++   amp   float   void   phi   graphics   pixel   poi   osi   

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];
          }
        }
      }
    }

任意角度图片旋转

标签:++   amp   float   void   phi   graphics   pixel   poi   osi   

原文地址:http://www.cnblogs.com/15157737693zsp/p/6015044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!