回転とスケーリング - どのように両方を行うと、正しい結果を取得しますか?
-
22-08-2019 - |
質問
私は、グラフィックスコンテキスト上のベクトルを描く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));
他のヒント
回転は常に、原点について実行されます。あなたが変換しなければならないのするために、特定のポイントを中心に回転ポイントます。
あなたはそれらが複合して適用される順序を制御するための変換を連結する順序を変更します。
所属していません StackOverflow