アフィン変換後の座標の取得方法と問題解決

このQ&Aのポイント
  • GraphicsのdrawImageに2次元のアフィン変換の行列の要素を指定して描画して、アフィン変換後に座標の取得方法を知りたいです。
  • 座標の取得に関して、計算式は正しいはずなのに実際には別の座標に表示されるという問題が発生しています。
  • 行列の計算に間違いがないはずなので、問題の解決方法や参考になるURLを教えていただきたいです。
回答を見る
  • ベストアンサー

アフィン変換後の座標について

GraphicsのdrawImageに2次元のアフィン変換の行列の要素を 指定して描画して、アフィン変換後に座標の取得したいのですが、 上手くいきません。 [ x'] [m00 m01 m02] [ x ] [ y'] = [m10 m11 m12] [ y ] [ 1 ] [ 0 0 1] [ 1 ] これを計算すると [ x'] [m00 * x + m01 * y + m02] [ y'] = [m10 * x + m11 * y + m12] [ 1 ] [ 1 ] となり、 座標(x', y') = (m00 * x + m01 * y + m02, m10 * x + m11 * y + m12) 座標(x', y')に表示されるはずですが、別の座標に表示されています。 行列の計算のどこに間違いがあるのかわかりません。 計算の仕方をご存知でしたら教えてください。 また参考になるURLをご存知でしたら教えてください。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

> 短形は画面中央で回転せずに だって、回転はさせてないから…。 矩形の左隅の位置が、最初の(x,y)から変わっただけでしょ。

onnobu
質問者

お礼

ありがとうございます。 初歩的な勘違いをしていました。 無事に解決できました。

その他の回答 (2)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

> g.drawImage(image, matrix); これは、あなたの自作のメソッドですか? いずれにしても、あなた以外の人にとっては謎です。 もっとちゃんと説明してくださいませんか?

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

計算自体は正しいんじゃないですか。 あとは、あなたが、何かを錯覚または誤解してるのか?? 詳細は現時点では分かりませんが。

onnobu
質問者

補足

// グラヒィックスオブジェクト Graphics g = getGraphics(); int matrix = new int[6]; 画像を表示する座標をx, y、幅をw、高さhがのイメージを画面の中心点で回転するようにした行列をmatrixに格納します。 g.drawImage(image, matrix); 次に画像の位置を調べるために短形を表示します。 int ix = 0, iy = 0; ix = matrix[0] * x + matrix[1] * y + matrix[2]; iy = matrix[3] * x + matrix[4] * y + matrix[5]; g.fillRect(ix, iy, w, h); drawImageで表示された画像は画面中央で回転しますが、 fillRectで表紙した短形は画面中央で回転せずに別の軸を中心に回転してしまいます。 どのように計算したら、短形の位置と画像の位置の基点を合わせることが できるのでしょうか?

関連するQ&A

  • アフィン変換の問題です、よろしくお願いします。

    幾何学的変換において2次元の座標変換をアフィン変換によって行うとき、地図座標(x,y)から画像座標(u,v)への変換において地上基準点が4点わかっているとすると変換係数を最小二乗法で求める方法はどのようになるか? というものです。 よろしくお願いしますm(__)m

  • matlabを使ったアフィン変換

    matlabを使ったアフィン変換を考えています。三次元座標(x,y,z)=(100,30,35), (X,Y,Z)=(105,28,34)が分かっていて(x,y,z)から(X,Y,Z)への回転(α、β、γ)および移動(dx,dy,dz)を求めたいのですがどのようにプログラミングを行えばよいのでしょうか?よろしくお願いします。

  • アフィン変換できる方助けてください

    アフィン変換(2次元・3次元)のすべての変換(スケール・相似・せん断・回転・平行)を次の3点の座標について計算しなさい。 A (1,2) A2 (3,4) A3 (2,5) この問題できる方、回答していただけたらありがたいです。またやり方だけでも教えてくれるとありがたいです。

  • 同次変換について

    前回の質問で同次変換とはどのようなものかおおよそ理解する事が出来ました。 追加質問したのですが、解決できないので新たに再質問させて頂きます。 前回の質問内容:http://okwave.jp/qa/q6934077.html 変換という言葉は理解できました。 同次変換とは、1次元多い行列で表現された変換をさす。 一次元多い理由は、並進を表すため。 数学的に定義される変換は、ユークリッド変換、アフィン変換、射影変換の 3つである。 ユークリッド変換についてよく理解できないので教えてください。 これは線形変換とは異なりますよね。線形変換であれば、並進は含みませんから。 アフィン変換は、線形変換に並進を加えたものだと認識しております。 アフィン変換とユークリッド変換の違いはなんでしょうか? ユークリッド変換の方がアフィン変換より集合的に大きいことはわかるのですが・・・ また同次変換を、 X Y Z 1 と表している記述を良く見ます。 具体例を挙げると、 基準座標系を(x y z 1)、対象座標系(X Y Z 1) と表す。 対象座標系は基準座標系をx軸にθ回転、x軸に3平行移動した ものとする。 X x|1   0    0    3 | Y= y|0  cosθ  sinθ  0 |  Z  z|0  -sinθ  cosθ 0 | 1 1|0   0     0   1 | のように表されると思います。 ここで、同次変換を X Y Z W と表すとすると、変換行列の4列目は、どのようにあらわされるのでしょうか? X x|1   0    0    ? | Y= y|0  cosθ  sinθ  ? |  Z  z|0  -sinθ  cosθ ? | W ?|0   0     0   ?  | 以上、申し訳ありませんがご回答よろしくお願い致します。

  • 2次元図形 アフィン変換

    2次元図形ABCDEFGHがある。頂点の座標をそれぞれA(0,0),B(2,0),C(2,2),D(3,2),E(2,3),F(0,3),G(-1,2),H(0,2)とする。 この図形を直線y=2x+1に対して反転せよ。 と言う問いなのですが、答えは A(-0.8,0.4),B(-2,2),C(-0.4,3.2),D(-1,4),E(0.4,3.8),F(1.6,2.2),G(1.4,0.8),H(0.8,1.6) になりましたが、合っていますでしょうか。 以前アフィン変換は3×3で行うとお聞きしましたので、ABC、DEF、GHと分け、それぞれ 0 2 2 0 0 2 1 1 1 3 2 0 2 3 3 1 1 1 -1 0 0 2 2 0 1 1 0 ↑GHは2個しかないので右側に0を付け加えました。 それらを -0.6 0.8 -0.8 0.8 0.6 0.4 0 0 1 と掛け合わせ、答えを求めました。(行列なのでかける順番はこちらが先です。)

  • 形変換 アフィン変換 

    形変換 アフィン変換  前回同様の内容で質問させて頂きました。 不明な点がいくつかありますので改めて質問させて頂きます。 前回の質問内容:http://okwave.jp/qa/q5957715.html アフィン変換 ⊃ 線型変換 であるとご回答頂いたのですが、これはアフィン変換は 線形変換を含むという認識で良いでしょうか? 線形変換はアフィン変換の部分集合だと理解したのですが間違いでしょうか? また、線形変換及びアフィン変換の定義に関して ・線型変換の定義: [1]  体 K 上のベクトル空間 V 上の変換 f で、  x,y∈V, a,b∈K, について常に f(ax+by) = a f(x) + b f(y) が成り立つもの。 ・アフィン変換の定義: [2]  体 K 上のベクトル空間 V 上の変換 f で、  x,y∈V, a,b∈K, について a+b = 1 のときは f(ax + by) = a f(x) + b f(y)  が成り立つもの。 とご教示頂きました。 定義[1],[2]について考えると、 [1]が成り立てば、[2]は成り立つと思います。 [1]はa+b=1によらず、f(ax+by)=af(x)+bf(y)が成り立ちますから。 翻って、[1]ならば[2]が成り立つと言うことは線形変換がアフィン変換を含むと 言う事になりませんか?この点で混乱しています・・・ ご回答よろしくお願い致します。

  • drawStringの座標について

    paintメソッド内で、drawStringで文字列を、 drawImageで画像をそれぞれ表示しています。 drawStringとdrawImageの両方で、同じ座標を 指定しても表示位置がずれます。x座標は ぴったり一致するのですがy座標が7から8ポイント ほどずれます。この二つのメソッドによる座標 と表示位置を一致させたいのですが、よい方法は ありませんでしょうか。どうぞよろしくお願い いたします。 public void paint(Graphics g) { g.drawImage(image,20,20,100,20); Font fnt=new Font("HGゴシックM",Font.PLAIN,12); g.setFont(fnt); g.drawString("Hello",20,20);//座標値はおなじで               も表示位置がずれる }

    • ベストアンサー
    • Java
  • 座標変換

    3次元(x,y,z)物体の回転でよくx軸、y軸、z軸で回転がありますが、xy平面との角度φを回転させたいときはどうすればいいでしょうか? xy平面との角度をφ回転させた後の座標(X,Y,Z)はどうなるのでしょうか? また X     x Y = T・y Z     z このような行列Tが存在するのでしょうか?

  • アフィン構造とは?

    ただいまロバスト制御について勉強を行っております. 閉ループ系の構造について調べていたところ閉ループ系のパラメータ行列はxに関するアフィン構造を持つと書かれていました. この例で何も知らない人にアフィン構造とはなにか説明する必要があるのですが 何をどのように説明していいのかわかりません. アフィン構造をもつというのはAx+Bの形をもつためアフィン変換できるというように考えています. しかしアフィン変換するということは何がどうなっているのかイメージがつかめないのです. 的外れな考えをしているかもしれませんが分かる方はよろしくお願いします.

  • スクリーン座標からワールド座標への座標変換について

    こんにちは。 現在自作で3Dゲームを制作しています。 ワールド座標からスクリーン座標への変換に成功したので 今度は逆にスクリーン座標からワールド座標への変換に挑戦していたのですが どうにもうまくいかずに詰まってしまい、質問にきました。 ワールド→スクリーン変換にて得たスクリーン座標(sx, sy, sz)を使用して スクリーン→ワールド変換を行うと成功するのですが 直接スクリーン→ワールド変換を行おうとすると失敗します。 というのも、直接スクリーン→ワールド変換時には sz にあたる値を どうしたらいいものか・・・となってしまったからです。 今回、手計算(ヘルプ関数は使わず)で行っているのですが、計算していることは ビューポート行列、プロジェクション行列、ビュー行列の逆行列を使用し スクリーン座標(とりあえずszを0にして対応)に対して座標変換をおこなっています。 何か計算が足りていないのか、はたまた勘違いをしているのか・・・ 詳しいご教授お願いいたします。 ワールド行列:単位行列 ビュー行列:視点と視線は動的に変動、上向き(0,1,0) プロジェクション行列:視野角45度、アスペクト比 800/600 画面サイズ:800×600 テストに使用しているスクリーン座標:(200,300)

専門家に質問してみよう