Операции матрицы преобразования Java - PullRequest
1 голос
/ 26 января 2012

Я пытаюсь сохранить, а затем использовать матрицу преобразования для программы компьютерной графики. Это матрица 3x3, в которой хранятся данные о масштабировании, повороте и переводе точек (x, y).

Моя программа может обрабатывать любой отдельный случай ... то есть, если я только масштабирую или только вращаю, она работает нормально. Тем не менее, кажется, что это не работает при объединении масштаба и поворота, и я думаю, что это связано с тем, как я комбинирую вращение и масштабирование в коде. Матрица называется преобразованием и имеет тип float. Следующие методы очищают, вращают, масштабируют и переводят (в указанном порядке) матрицу.

public void clearTransform()
{
    transformation[0][0] = 1;transformation[0][1] = 0;transformation[0][2] = 0;
    transformation[1][0] = 0;transformation[1][1] = 1;transformation[1][2] = 0;
    transformation[2][0] = 0;transformation[2][1] = 0;transformation[2][2] = 1;
}

public void rotate (float degrees)
{
    double r = degrees * (Math.PI/180);
    float sin = (float)Math.sin(r);
    float cos = (float)Math.cos(r);
    transformation[0][0] *= cos;
    transformation[1][1] *= cos;
    if(transformation[0][1] == 0)
        transformation[0][1] = -sin;
    else 
        transformation[0][1] *= -sin;
    if(transformation[1][0] == 0) 
        transformation[1][0] = sin;
    else 
        transformation[1][0] *= sin;
}

public void scale (float x, float y)
{
    transformation[0][0] *= x;
    transformation[1][1] *= y;
}

public void translate (float x, float y)
{
    transformation[0][2] += x;
    transformation[1][2] += y;
}

Для шкалы матрица содержит информацию, подобную этой:

(Sx, 0, 0) (0, Sy, 0) (0, 0, 1)

для вращения, вот так:

(соз (тета), -син (тета), 0) (грех (тета), соз (тета), 0) (0, 0, 1)

для перевода, это:

(1, 0, Tx) (0, 1, ты) (0, 0, 1)

Не думаю, что правильно совмещаю масштаб и вращение. Вот где я на самом деле применяю преобразование:

public float[] transformX(float[] x, float[] y, int n) {
    float[] newX = new float[n];
    for(int i = 0; i < n; i ++) {
        newX[i] = (x[i] * transformation[0][0]) + (y[i] * transformation[0][1]) + transformation[0][2];
    }
    return newX;
}

public float[] transformY(float[] x, float[] y, int n) {
    float[] newY = new float[n];
    for(int i = 0; i < n; i ++) {
        newY[i] = (x[i] * transformation[1][0]) + (y[i] * transformation[1][1]) + transformation[1][2];
    }
    return newY;
}

Где x и y - предварительно преобразованные точечные массивы, а n - количество точек

Спасибо за любую помощь!

1 Ответ

3 голосов
/ 01 марта 2012

Я думаю, что правильное преобразование должно быть:

enter image description here

...