Java图像变换类 - AffineTransform

 

        很多人都研究过GL的Animation编辑器,但是对其XML数据文件中Sprite的m00 m01 m02 m10 m11 m12我想并不是每个人都能弄的明白,其实他们是Java的图像变换类AffineTransform的6个参数。
 
        AffineTransform是J2SE中非常重要的专门处理2D图像仿射变换的类,尤其在游戏工具编写中经常会用到。该类的构造函数有6个参数m00 m10 m01 m11 m02 m12,会构造一个矩阵
[m00 m01 m02]
[m10 m11 m12]
[  0     0     1 ]
注意这6个参数的顺序,CoCoMo曾经因为搞错了参数的顺序而得出了错误的结果,最郁闷的是还被jedi忽悠说曾经有种Identity矩阵不是以
[1  0  0]
[0  1  0]
[0  0  1]
格式存储的,误导我半天没有找到问题所在
 
当构建出了该矩阵后,则平移时左乘一个平移矩阵
[1  0  tx]
[0  1  ty]
[0  0   1]
反转X时左乘一个缩放矩阵
[-1   0   0]
[ 0   1   0]
[ 0   0   1]
反转Y时左乘一个缩放矩阵
[1   0   0]
[0  -1   0]
[0   0   1]
旋转时左乘一个旋转矩阵
[cos(theta)  -sin(theta)  0]
[sin(theta)   cos(theta)  0]
[   0                  0        1]
然后将该矩阵setTransform到Graphics2D里即可画图了。
 
要想得到变换后的数据,调用getMatrix得到一个double数组matrix,matrix[4]即X轴偏移量,matrix[5]即Y轴偏移量。假如matrix[0] < 0即反转了X,matrix[3] < 0即反转了Y。
double degree = Math.toDegrees(Math.asin(matrix[1]));
if(degree < 0)
      degree += 360;
即可得到旋转的角度。

原文:http://j2medev.spaces.live.com/blog/cns!8D09CFF9FE06ED5D!1065.entry
posted @ 2007-07-02 15:17    阅读(4150)  评论(1编辑  收藏  举报