图像旋转程序原理分析
请帮我注释一下这个程序,主要是旋转原理,这个程序红色部分看不懂。
Graphics::TBitmap *Source = Image1->Picture->Bitmap;
Graphics::TBitmap *NewPic = new Graphics::TBitmap();
int angle = StrToInt(Edit2->Text);
angle = angle % 360;
if(angle>180)angle=angle-360;
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=0,miny=0,maxx=0,maxy=0;
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]; }
}
}
this->Image1->Transparent = true;
this->Image1->Picture->Bitmap = NewPic;
//Canvas->Draw(0,0,NewPic);
Button4->Enabled = false;
delete NewPic; }
else ShowMessage("Please open a picture or input a value!");