如何将java Affine Transform映射到android的Matrix?

时间:2010-08-20 20:28:55

标签: java android

假设我按如下方式初始化AffineTransform:

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

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

3 个答案:

答案 0 :(得分:12)

来自AffineTransform's 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});

答案 1 :(得分:4)

AffineTransform中提供的订单提供为:

  

java.awt.geom.AffineTransform.AffineTransform(float m00, float m10, float m01, float m11, float m02, float m12)

     

从6个浮点值构造一个新的AffineTransform,表示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坐标缩放元素(Matrix.MSCALE_X
   m01 3x3矩阵(Matrix.MSKEW_X)的X坐标剪切元素
   m02 3x3矩阵(Matrix.MTRANS_X)的X坐标平移元素
   m10 3x3矩阵(Matrix.MSKEW_Y)的Y坐标剪切元素
   m11 3x3矩阵(Matrix.MSCALE_Y)的Y坐标缩放元素
   m12 3x3矩阵(Matrix.MTRANS_Y)的Y坐标平移元素
   m20 3x3矩阵的第一个透视元素(Matrix.MPERSP_0
   m21 3x3矩阵的第二个透视元素(Matrix.MPERSP_1
   m22 3x3矩阵的第三个透视元素(Matrix.MPERSP_2

答案 2 :(得分:0)

这是一个演示Java代码:

 public static float[] createMatrixValues(AffineTransform Tx) {
    double[] at = new double[9];
    Tx.getMatrix(at);
    float[] f = new float[at.length];
    f[0] = (float) at[0];
    f[1] = (float) at[2];
    f[2] = (float) at[4];
    f[3] = (float) at[1];
    f[4] = (float) at[3];
    f[5] = (float) at[5];
    f[6] = 0;
    f[7] = 0;
    f[8] = 1;
    return f;
}

并创建Matrix对象:

public static Matrix createMatrixObj(AffineTransform Tx) {
    Matrix m = new Matrix();
    m.reset();
    m.setValues(createMatrix(Tx));
    return m;
}

我希望这个辅助方法能解决你的问题。