Вращение и масштабирование - Как сделать оба и получить правильный результат? - PullRequest
3 голосов
/ 25 марта 2009

У меня есть набор вызовов Java2D, которые рисуют векторы в графическом контексте. Я бы хотел, чтобы изображение было увеличено вдвое, а затем повернуто на 90 градусов.

Я использую следующий код для этого:

Graphics2D g2 = // ... get graphics 2d somehow ...
AffineTransform oldTransform = g2.getTransform();
AffineTransform newTransform = (AffineTransform)oldTransform.clone();
newTransform.concatenate(AffineTransform.getTranslateInstance(x1, x2));
newTransform.concatenate(AffineTransform.getScaleInstance((double)newW/(double)iconW, (double)newH/(double)iconH));
newTransform.concatenate(AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), (double)iconW/2.0d, (double)iconH/2.0d));
// ... do my drawing ...

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

Есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 25 марта 2009

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

newTransform.concatenate(AffineTransform.getTranslateInstance(x1, x2));
newTransform.concatenate(AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), (double)iconW/2.0d, (double)iconH/2.0d));
newTransform.concatenate(AffineTransform.getScaleInstance((double)newW/(double)iconW, (double)newH/(double)iconH));
2 голосов
/ 25 марта 2009

Повороты всегда выполняются относительно происхождения. Чтобы вращался вокруг определенной точки , необходимо перевести точки.

На этой странице объясняется математика того, что вы пытаетесь сделать, и показано, почему преобразования должны применяться в определенном порядке.

1 голос
/ 25 марта 2009

Измените порядок, в котором вы объединяете преобразования, чтобы управлять порядком их применения в композите.

...