|
B:一个简单的浮点实现版本
|
////////////////////////////////////////////////////////////////////////////////////////////////////// //函数假设以原图片的中心点坐标为旋转和缩放的中心 void PicRotary0(const TPicRegion& Dst,const TPicRegion& Src,double RotaryAngle,double ZoomX,double ZoomY,double move_x,double move_y) { if ( (fabs(ZoomX*Src.width)<1.0e-4) || (fabs(ZoomY*Src.height)<1.0e-4) ) return; //太小的缩放比例认为已经不可见 double rx0=Src.width*0.5; //(rx0,ry0)为旋转中心 double ry0=Src.height*0.5; for (long y=0;y { for (long x=0;x { long srcx=(long)((x- move_x-rx0)/ZoomX*cos(RotaryAngle) - (y- move_y-ry0)/ZoomY*sin(RotaryAngle) + rx0) ; long srcy=(long)((x- move_x-rx0)/ZoomX*sin(RotaryAngl e) + (y- move_y-ry0)/ZoomY*cos(RotaryAngle) + ry0) ; if (PixelsIsInPic(Src,srcx,srcy)) Pixels(Dst,x,y)=Pixels(Src,srcx,srcy); } } } (调用方法比如: PicRotary0(ppicDst,ppicSrc,PI/6,0.9,0.9,(dst_wh-ppicSrc.width)*0.5,(dst_wh-ppicSrc.height)*0.5); //作用:将图片ppicSrc按0.9的缩放比例旋转PI/6幅度后绘制到图片ppicDst的中心 )
|
//注:测试图片都是800*600的图片旋转到1004*1004的图片中心
////////////////////////////////////////////////////////////////////////////////
//速度测试:
//==============================================================================
// PicRotary0 13.6 fps
////////////////////////////////////////////////////////////////////////////////
旋转结果图示(小图):

//todo:更换图片,不使用左右对称的源图片
C:优化循环内部,化简系数
1.sin和cos函数是很慢的计算函数,可以在循环前预先计算好sin(RotaryAngle)和cos(RotaryAngle)的值:
double sinA=sin(RotaryAngle);
double cosA=cos(RotaryAngle);
2.可以将除以ZoomX、ZoomY改成乘法,预先计算出倒数:
double rZoomX=1.0/ZoomX;
double rZoomY=1.0/ZoomY;
3.优化内部的旋转公式,将能够预先计算的部分提到循环外(即:拆解公式):
原: long srcx=(long)((x- move_x-rx0)/ZoomX*cos(RotaryAngle) - (y- move_y-ry0)/ZoomY*sin(RotaryAngle) + rx0) ;
long srcy=(long)((x- move_x-rx0)/ZoomX*sin(RotaryAngle) + (y- move_y-ry0)/ZoomY*cos(RotaryAngle) + ry0) ;
变形为:
long srcx=(long)( Ax*x + Bx*y +Cx ) ;
long srcy=(long)( Ay*x + By*y +Cy ) ;
其中: Ax=(rZoomX*cosA); Bx=(-rZoomY*sinA); Cx=(-(rx0+move_x)*rZoomX*cosA+(ry0+move_y)*rZoomY*sinA+rx0);
Ay=(rZoomX*sinA); By=(rZoomY*cosA); Cy=(-(rx0+move_x)*rZoomX*sinA-(ry0+move_y)*rZoomY*cosA+ry0);
(提示: Ax,Bx,Cx,Ay,By,Cy都可以在旋转之前预先计算出来)
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页
 【责编:Kittoy】
|