2009-03-25 12 views
3

私はグラフィックスコンテキスト上にベクトルを描く一連のJava2D呼び出しを持っています。画像が2倍に拡大され、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

私はこれらの変換がスタックのように実装されていると信じています。最後の変換が最初に実行されます。回転とスケール変換の順序を逆にしてみて、探しているものを取得する必要があります。

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

これは機能しますが、わかりません。翻訳を最初に適用するのはなぜ大丈夫ですか?つまり、翻訳が最初の場合は最初に起こります。しかし回転が最初に適用されても、スケールはスケールの後で回転しますか?そこに私は理解していない何かがあります。 – jsight

+0

変換が正しく動作する理由を正確に説明するのは難しいですが、基になる行列の数学を見れば、なぜ意味があるのでしょうか。 –

1

トランスフォームを連結してコンポジットに適用する順序を制御する順序を変更します。

2

回転は常に起点について行われます。 rotate about a certain pointにするにはポイントを翻訳する必要があります。

This pageは、何をしようとしているかの背後にある数学について説明し、変換を特定の順序で適用する必要がある理由を示しています。

+0

getRotateInstanceの第2引数と第3引数が変換を管理します。これは同じ問題ではありませんでした。 – jsight

関連する問題