Как сопоставить java AffineTransform с андроидной матрицей?

Предположим, что я инициализирую AffineTransform, как показано ниже:

AffineTransform af = новый AffineTransform (2, 3, 4, 5, 6, 7);

Как создать эквивалентную матрицу с помощью android sdk?

Ответы

Ответ 1

От AffineTransform 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});

EDIT: Комментарий указывает, что порядок должен быть

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)

Создает новый AffineTransform из 6 значений с плавающей запятой, представляющих 6 заданных записей матрицы преобразования 3x3.

Параметры:
m00 элемент X-масштабирования матрицы 3x3
m10 координатный сдвигающий элемент Y матрицы 3x3
m01 элемент сдвига X-координаты матрицы 3x3
m11 элемент масштабирования координаты Y матрицы 3x3
m02 элемент преобразования координат X матрицы 3x3
m12 элемент перевода Y-координаты матрицы 3x3

Пример реализации:

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 значений из массива в матрицу. В зависимости от реализации Матрицы они могут быть преобразованы в 16.16 целых чисел в Матрице, так что последующий вызов getValues ​​() не даст точно таких же значений.

Значения представлены в матрице 3x3 в следующем порядке:

float[] {  
    m00, m01, m02,
    m10, m11, m12,
    m20, m21, m22
}

Где:

m00 элемент X-масштабирования матрицы 3x3 (Matrix.MSCALE_X)
m01 элемент сдвига X-координаты матрицы 3x3 (Matrix.MSKEW_X)
m02 элемент преобразования координат X матрицы 3x3 (Matrix.MTRANS_X)
m10 координатный сдвигающий элемент Y матрицы 3x3 (Matrix.MSKEW_Y)
m11 элемент масштабирования координаты Y матрицы 3x3 (Matrix.MSCALE_Y)
m12 элемент перевода координаты Y матрицы 3x3 (Matrix.MTRANS_Y)
m20 первый перспективный элемент матрицы 3x3 (Matrix.MPERSP_0)
m21 второй перспективный элемент матрицы 3x3 (Matrix.MPERSP_1)
m22 третий перспективный элемент матрицы 3x3 (Matrix.MPERSP_2)

Ответ 3

Это демо-код 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;
}

Я надеюсь, что эти вспомогательные методы решают ваш вопрос.