Как сопоставить 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;
}
Я надеюсь, что эти вспомогательные методы решают ваш вопрос.