Почему Java AffineTransforms компонуются в обратном порядке?

Преобразования Java, выполняемые с помощью Graphics2D и AffineTransforms, имеют порядок, указанный последним и примененный первым. Например, чтобы повернуть компонент, а затем перевести его, вы сначала вызываете translate(), а затем rotate(). Это почему? Есть ли какое-то приложение или реализация, которая поддерживает это? Мне это просто кажется контринтуитивным.

Я понимаю, что AffineTransforms представлены матрицей, и (хотя я не знаю подробностей) несколько преобразований могут быть объединены путем умножения матриц друг на друга. Чего я не понимаю, так это почему это кажется правым, а не левым.


person krs013    schedule 01.04.2014    source источник
comment
Как правило, умножение матриц не коммутативно; подробнее здесь.   -  person trashgod    schedule 02.04.2014


Ответы (1)


Подумайте об этом так: преобразование, указанное позже, ближе к следующему за ним примитиву рисования и, следовательно, применяется первым.

Эта последовательность упрощает применение преобразования к сложному чертежу. Предположим, у вас есть метод, который рисует какую-то сложную фигуру и сам использует преобразования. Вы хотите, чтобы фигура появлялась дважды в разных размерах. Вы можете сначала установить преобразование масштабирования, а затем вызвать свой метод. Для второго появления вы устанавливаете другое масштабирование, а затем снова вызываете свой метод.

Это было бы невозможно, если бы преобразования задавались в другом порядке.

person Henry    schedule 01.04.2014
comment
Итак, в вашем методе paint() это означает, что вы можете масштабировать объект Graphics2D, а затем передавать его в подкомпоненты для применения дальнейших преобразований, которые должны произойти в первую очередь, а затем? Я правильно это понимаю? - person krs013; 02.04.2014
comment
Да, точно. Это позволяет вам установить преобразование, которое применяется ко всему остальному, что приходит. - person Henry; 02.04.2014
comment
Было бы неплохо увидеть математический анализ и/или анализ времени компиляции этого, re: матричное (лево- и/или правостороннее) умножение и линейная алгебра. - person mdhansen; 01.02.2016