回転とスケーリング - どのように両方を行うと、正しい結果を取得しますか?

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

質問

私は、グラフィックスコンテキスト上のベクトルを描く2Dで呼び出しのセットを持っています。画像のサイズが倍増した後、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));
scroll top