Требует ли конкатенация экземпляров AffineTransform определенного порядка в Java? - PullRequest
4 голосов
/ 07 февраля 2012

У меня есть коллекция экземпляров AffineTranform.В зависимости от конкретных условий мне нужно объединить любой из них - условия здесь не важны.При этом я обнаружил, что порядок конкатенации, кажется, имеет некоторое значение.Глядя на пример, у меня есть:

  1. одна оригинальная трансформация «оригинал», которая масштабируется и переводится2.одна единичная матрица «один»
  2. одна единичная матрица «два»
  3. одна трансформация «масштаб», которая масштабируется
  4. одна трансформация «перевод», которая переводит

В этом примере я создаю следующие комбинации: 1. одна x шкала x translate 2. две x шкалы translatex

В соответствии с документацией Java матрицы должны быть умножены при объединении, но с учетом выходных данныхПример кода показывает разные результаты.

Версия Java: обновление Java 6 SE 30

Пример:

package affinetransformationtest;

import java.awt.geom.AffineTransform;

public class AffineTransformationTest {

    public static void main(String[] args) {
        AffineTransform original = new AffineTransform(10, 0.0, 0.0, 100, 2, 3);
        System.out.println("original: " + original);
        System.out.println("");

        AffineTransform scale = AffineTransform.getScaleInstance(10, 100);
        AffineTransform translate= AffineTransform.getTranslateInstance(2, 3);

        AffineTransform one = new AffineTransform();
        System.out.println("one: " + one);
        one.concatenate(scale);
        System.out.println("one + scale: " + one);
        one.concatenate(translate);
        System.out.println("one + scale + translate: " + one);
        System.out.println("Is one equal to original: " + original.equals(one)); //is false
        System.out.println("");

        AffineTransform two = new AffineTransform();
        System.out.println("two: " + two);
        two.concatenate(translate);
        System.out.println("two + translate: " + two);
        two.concatenate(scale);
        System.out.println("two + translate + scale: " + two);
        System.out.println("Is two equal to original: " + original.equals(two)); //is true
        System.out.println("");
    }
}

Вывод:

original: AffineTransform[[10.0, 0.0, 2.0], [0.0, 100.0, 3.0]]

one: AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
one + scale: AffineTransform[[10.0, 0.0, 0.0], [0.0, 100.0, 0.0]]
one + scale + translate: AffineTransform[[10.0, 0.0, 20.0], [0.0, 100.0, 300.0]]
Is one equal to original: false

two: AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
two + translate: AffineTransform[[1.0, 0.0, 2.0], [0.0, 1.0, 3.0]]
two + translate + scale: AffineTransform[[10.0, 0.0, 2.0], [0.0, 100.0, 3.0]]
Is two equal to original: true

Есть ли проблема с Java или у меня ошибка в моем коде?
Спасибо за любую подсказку.

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Заказ имеет значение. Посмотрите на свою вторую конкатенацию, вы также масштабируете свой перевод, так как он применяется раньше.

1 голос
/ 07 февраля 2012

Да, порядок умножения матриц важен .Посмотрите на эти простые примеры, в которых одни и те же матрицы умножаются в разном порядке:

Example1

Example2

0 голосов
/ 16 июля 2012

Линейная алгебра (математическая модель для матриц) отличается от базовой алгебры.Одно из самых простых отличий заключается в том, что умножение не является коммутативным.Таким образом, A x B даст другой результат, чем B x A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...