- PR -

AffineTransformによるイメージの原点位置指定について

1
投稿者投稿内容
いつはし
会議室デビュー日: 2006/10/30
投稿数: 12
投稿日時: 2006-10-30 20:42
はじめまして。
現在、XY座標上にイメージを描画し、ユーザーがイメージのサイズ等調整ができるイメージビューワーを作成中です。
しかし、イメージの原点を画面左下隅に設定して表示するよい方法が見つかりません。

AffineTransformを使い以下の方法で試しましたが、それぞれうまくいきませんでした。

・Y軸を逆にしたAffineTransformを作成。ユーザーの指示を受けてscaleし、描画領域にdrawImageする。
//コンストラクタ
AffineTransform at = new AffineTransform(1.0f, 0.0f, 0.0f, -1.0f, 0, imageViewerHeight);
//ユーザーがEventを投げる
at.scale(zoomSizeX, zoomSizeY);
imageViewerGraphics2D.drawImage(modelImage, at, this);

→原点位置は設定できたが、イメージが反転(ミラー?)してしまい、rotateしても元に戻らない。

・通常のコンストラクタでAffineTransformを作成し、原点が合うようにtranslateする。ユーザーの指示を受けてscaleし、スケールサイズ分translate後、描画領域にdrawImageする。
//コンストラクタ
AffineTransform at = new AffineTransform();
at .translate(0, imageViewerHeight - modelImageHeight);
//ユーザーがEventを投げる
at.scale(zoomSizeX, zoomSizeY);
at.translate(0, -(modelImageHeight * zoomSizeY - modelImageHeight));
imageViewerGraphics2D.drawImage(modelImage, at, this);

→原点位置を設定しにくい上、Y軸の位置が合わなかった。

AffineTransformに対する基本的な考え間違いがあったら申し訳ありません。
よい方法がありましたらご教授ください。よろしくお願いします。
いつはし
会議室デビュー日: 2006/10/30
投稿数: 12
投稿日時: 2006-10-31 12:33
自己解決しました。

通常のコンストラクタでAffineTransformを作成後、scaleする前にscaleサイズ分をtranslateするとうまく表示されました。
また、AffineTransformを新規作成してscaleサイズ分をtranslateし、元となるAffineTransformをconcatenateして描画するという方法でも同じ結果が得られました。

ただこの場合、設定変更に合わせて毎回原点位置にtranslateしなくてはなりません。もしより良い方法で原点位置を指定できる方法がありましたら、よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)