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

来源:互联网 发布:mysql免安装版配置教程 编辑:程序博客网 时间:2024/06/05 15:10
图像处理系列之旋转
作者: HouSisong
日期: 2009-08-14
本文介绍了图像旋转的原理和公式,并给出了公式的推导过程。

旋转原理和旋转公式

旋转示意图

如果果一个点(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. 任意角度的高质量的快速的图像旋转(上篇)-- 纯软件的任意角度的快速旋转
原创粉丝点击