如何将java的AffinTransform映射到Android的Matrix?
假设我初始化一个仿射变换,如下所示:
AffineTransform af = new AffineTransform(2, 3, 4, 5, 6, 7);
我如何使用Android的sdk创建等效的Matrix?
假设我初始化一个仿射变换,如下所示:
AffineTransform af = new AffineTransform(2, 3, 4, 5, 6, 7);
我如何使用Android的sdk创建等效的Matrix?
[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ]
[ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ]
[ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]
不确定,但也许
Matrix m = new Matrix();
m.setValues(new float[]{2,3,4,5,6,7,0,0,1});
编辑:评论者指出顺序应该是
m.setValues(new float[]{2,4,6,3,5,7,0,0,1});
AffineTransform中提供的顺序提供如下:
java.awt.geom.AffineTransform.AffineTransform(float m00, float m10, float m01, float m11, float m02, float m12)
从 6 个浮点值构造一个新的仿射 Transform,这些浮点值表示 3x3 转换矩阵的 6 个可指定条目。
参数:
m00 3x3 矩阵
的 X 坐标缩放元素 m10 3x3 矩阵
的 Y 坐标剪切元素 m01 3x3 矩阵
的 X 坐标剪切元素 m11 3x3 矩阵
的 Y 坐标缩放元素 m02 3x3 矩阵
的 X 坐标平移元素 m12 3x3 矩阵的 Y 坐标平移元素
示例实现:
new AffineTransform(
q0, q1, q2,
q3, q4, q5);
反直觉地产生:
[ m00 m01 m02 ] [ q0 q2 q4 ]
[ m10 m11 m12 ] = [ q1 q3 q5 ]
[ 0 0 1 ] [ 0 0 1 ]
要使用以下命令获得相同的结果:android.graphics.Matrix
Matrix m = new Matrix();
m.setValues(new float[] {
q0, q2, q4,
q1, q3, q5,
0, 0, 1
}
我认为Matrix的方法文档可以改进;它应该反映其参数的顺序是:setValues()
void android.graphics.Matrix.setValues(float[] values)
将数组中的 9 个值复制到矩阵中。根据 Matrix 的实现,这些可以在 Matrix 中转换为 16.16 个整数,这样后续调用 getValues() 就不会产生完全相同的值。
这些值按以下顺序提供给 3x3 矩阵:
float[] { m00, m01, m02, m10, m11, m12, m20, m21, m22 }
哪里:
m00 3x3 矩阵的 X 坐标平移元素 ()
m01 3x3 矩阵的 X 坐标剪切元素 ()
m02 3x3 矩阵的 X 坐标平移元素 ()
m10 3x3 矩阵的 Y 坐标剪切元素 ()
m11 3x3 矩阵的 Y 坐标平移元素 ()
m12 3x3 矩阵的 Y 坐标平移元素 ()
m20 3x3 矩阵的第一个透视元素 ()
m21 3x3 矩阵的第二个透视元素 ()
m22 3x3 矩阵的第三个透视元素 (Matrix.MSCALE_X
Matrix.MSKEW_X
Matrix.MTRANS_X
Matrix.MSKEW_Y
Matrix.MSCALE_Y
Matrix.MTRANS_Y
Matrix.MPERSP_0
Matrix.MPERSP_1
Matrix.MPERSP_2
)