韩冰 发表于 2005-1-26 12:47

任意角度图片旋转

<P>void S_PicXZ(Graphics::TBitmap *Source,Graphics::TBitmap *NewPic,int angle)//
{
if(angle&gt;180)angle=360-angle;
if(angle&lt;-180)angle=360+angle; </P>
<P>float radians=(2*3.1416*angle)/360;
float cosine=(float)cos(radians);
float sine=(float)sin(radians);
float Point1x=(-Source-&gt;Height*sine);
float Point1y=(Source-&gt;Height*cosine);
float Point2x=(Source-&gt;Width*cosine-Source-&gt;Height*sine);
float Point2y=(Source-&gt;Height*cosine+Source-&gt;Width*sine);
float Point3x=(Source-&gt;Width*cosine);
float Point3y=(Source-&gt;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&gt;90&amp;&amp;angle&lt;180)
DestBitmapWidth=(int)ceil(-minx);
else
DestBitmapWidth=(int)ceil(maxx-minx); </P>
<P>if(angle&gt;-180&amp;&amp;angle&lt;-90)
DestBitmapHeight=(int)ceil(-miny);
else
DestBitmapHeight=(int)ceil(maxy-miny); </P>
<P>NewPic-&gt;Height=DestBitmapHeight;
NewPic-&gt;Width=DestBitmapWidth;
for(int x=0;x&lt;DestBitmapWidth;x++)
{
for(int y=0;y&lt;DestBitmapHeight;y++){
int SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine);
int SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine);
if(SrcBitmapx&gt;=0&amp;&amp;SrcBitmapx&lt;Source-&gt;Width&amp;&amp;SrcBitmapy&gt;=0&amp;&amp;
SrcBitmapy&lt;Source-&gt;Height)
{
NewPic-&gt;Canvas-&gt;Pixels=
Source-&gt;Canvas-&gt;Pixels;
}
}
}
} </P>
页: [1]
查看完整版本: 任意角度图片旋转