假设我按如下方式初始化AffineTransform:
AffineTransform af = new AffineTransform(2,3,4,5,6,7);
如何使用android的sdk创建等效的Matrix?
答案 0 :(得分:12)
[ 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;
}
我希望这个辅助方法能解决你的问题。