Вращение и масштабирование — как сделать и то, и другое и получить правильный результат?

StackOverflow https://stackoverflow.com/questions/682770

Вопрос

У меня есть набор вызовов 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 ...

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

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

Это было полезно?

Решение

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

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));

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top