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 ...

これは回転してスケーリングしますが、スケールが希望どおりに適用されていません。拡大縮小する前に回転しているように見えるため、画像が間違った軸で広くなります。

これを行うためのより良い方法はありますか?

4

3 に答える 3

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));
于 2009-03-25T18:08:00.243 に答える
2

回転は常に原点を中心に実行されます。特定の点を中心に回転するには、点を平行移動する必要があります。

このページでは、やろうとしていることの背後にある数学について説明し、特定の順序で変換を適用する必要がある理由を示します。

于 2009-03-25T18:22:07.773 に答える
1

変換を連結する順序を変更して、複合に適用される順序を制御します。

于 2009-03-25T18:07:00.790 に答える