天天看点

/LGC图形渲染/图像处理系列之旋转

图像处理系列之旋转 作者: HouSisong 日期: 2009-08-14 本文介绍了图像旋转的原理和公式,并给出了公式的推导过程。

旋转原理和旋转公式

旋转示意图

/LGC图形渲染/图像处理系列之旋转

如果果一个点(x,y)旋转到(x',y'),对应的角度旋转从b到(b+a),那么旋转 公式为:

x' = x * cos(a) - y * sin(a);

y' = x * sin(a) + y * cos(a);



      

公式的推导过程如下所示:

有:

tg(b)=y/x                             ----(1)

    tg(a+b)=y'/x'                         ----(2)

    x*x + y*y = x'*x' + y'*y'             ----(3)



      

有公式:

tg(a+b) = ( tg(a)+tg(b) ) / ( 1-tg(a)*tg(b) )  ----(4)



      

把(1)代入(4)从而消除参数b:

tg(a)+y/x = y'/x'*( 1-tg(a)*y/x )                ----(5)



      

由(5)可以得

x'=y'*(x-y*tg(a))/( x*tg(a)+y )       ----(6)



      

把(6)代入(3)从而消除参数x',化简后求得:

y'=x*sin(a)+y*cos(a);                     ----(7)



      

把(7)代入(6),有:

x'=x*cos(a)-y*sin(a);                     ----(8)



      

应用

假设对图片上任意点(x,y),绕一个坐标点(rx0,ry0)逆时针旋转RotaryAngle角度后的新的坐标设为(x', y'),x平移rx0,y平移ry0,角度a对应-RotaryAngle , 带入方程(7)、(8)后,得到公式:

x'= (x - rx0)*cos(RotaryAngle) + (y - ry0)*sin(RotaryAngle) + rx0

    y'= =-(x - rx0)*sin(RotaryAngle) + (y - ry0)*cos(RotaryAngle) + ry0



      

那么,根据新的坐标点求源坐标点的公式为:

x=(x'- rx0)*cos(RotaryAngle) - (y'- ry0)*sin(RotaryAngle) + rx0 ;

    y=(x'- rx0)*sin(RotaryAngle) + (y'- ry0)*cos(RotaryAngle) + ry0 ;

      

旋转的时候还可以顺便加入x轴和y轴的缩放和平移,而不影响速度,那么完整的 公式为:

x=(x'- move_x-rx0)/ZoomX*cos(RotaryAngle) - (y'- move_y-ry0)/ZoomY*sin(RotaryAngle) + rx0 ;

  y=(x'- move_x-rx0)/ZoomX*sin(RotaryAngle) + (y'- move_y-ry0)/ZoomY*cos(RotaryAngle) + ry0 ;



      

其中:

  • RotaryAngle为逆时针旋转的角度;
  • ZoomX,ZoomY为x轴y轴的缩放系数(支持负的系数,相当于图像翻转);
  • move_x,move_y为x轴y轴的平移量;

Reference

  1. 任意角度的高质量的快速的图像旋转(上篇)-- 纯软件的任意角度的快速旋转