如何将java的AffinTransform映射到Android的Matrix?

2022-09-03 02:03:39

假设我初始化一个仿射变换,如下所示:

AffineTransform af = new AffineTransform(2, 3, 4, 5, 6, 7);

我如何使用Android的sdk创建等效的Matrix?


答案 1

来自AffinTransform的javadoc

[ 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});

答案 2

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_XMatrix.MSKEW_XMatrix.MTRANS_XMatrix.MSKEW_YMatrix.MSCALE_YMatrix.MTRANS_YMatrix.MPERSP_0Matrix.MPERSP_1Matrix.MPERSP_2)


推荐