- ベストアンサー
携帯アプリで任意の軸を中心に回転させる方法は?
Graphics g = getGraphics(); g.setOrigin(120,120); g.drawImage("イメージファイル","2次元アフィン"); "イメージファイル"はオフスクリーンで作成されたデータです。 こちらの方法を使用いたしますと、 g.setOriginで指定された軸を中心に画像が回転してしまいます。 画面中心を軸として画面全体が回転する方法が見つかりません。 ご存知の方、お教え下さい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
確認していないので、参考までに /* @param r:回転角度 @param x:回転する前の描画X座標 @param y:回転する前の描画Y座標 @param w:X方向の拡大 @param h:Y方向の拡大 */ private int[] Set_matrics(int r, int x, int y, int w, int h){ int m = new int[6]; int cx,cy; int dx,dy; int len; //回転の中心 cx=120; cy=120; //回転の中心からの差分 dx=x-cx; dy=y-cy; m[0] = Get_cos(r) + w; m[1] = Get_sin(r) + h; //m[2] = 4096 * x / 2; // なぜ 2 で割っているか? m[2] = ( dx*Get_cos(r)+dy*Get_sin(r))+4096*cx; m[3] = -Get_sin(r) - w; m[4] = Get_cos(r) + h; //m[5] = 4096 * y / 2; // なぜ 2 で割っているか? m[5] = (-dx*Get_sin(r)+dy*Get_cos(r))+4096*cy; return m; }
その他の回答 (1)
- alphion
- ベストアンサー率19% (27/136)
見ていないのでわかりませんが、回転の部分しか設定をしていないのだと思います。 2次元アフィンの式のm02,m12の設定も含めてちゃんと設定すれば出来ると思います。
補足
申し訳ありませんでした。 2次元アフィンのデータを記載しておりませんでした。 private int sList[];// sinの10度毎のテーブル // 4096をベースとして角度が10度単位で、三角関数(sin)を求める private int Get_sin(int radian){ while(radian < 0) radian = radian + 36; while(radian >= 36) radian = radian - 36; if(radian <= 18) return sList[radian]; return -Get_sin(radian - 18); } // 4096をベースとして角度が10度単位で、三角関数(cos)を求める private int Get_cos(int radian){ return Get_sin(radian + 9); } /* @param r:回転角度 @param x:描画するX座標 @param y:描画するY座標 @param w:X方向の拡大 @param h:Y方向の拡大 */ private int[] Set_matrics(int r, int x, int y, int w, int h){ int m = new int[6]; m[0] = Get_cos(r) + w; m[1] = Get_sin(r) + h; m[2] = 4096 * x / 2; m[3] = -Get_sin(r) - w; m[4] = Get_cos(r) + h; m[5] = 4096 * y / 2; return m; } こちらが2次元アフィン作成関数です。 これをどのように変換したらいいのでしょうか?
お礼
ありがとうございます。 画面中央を軸に画像が回転するようになりました。