• ベストアンサー

携帯アプリで任意の軸を中心に回転させる方法は?

Graphics g = getGraphics(); g.setOrigin(120,120); g.drawImage("イメージファイル","2次元アフィン"); "イメージファイル"はオフスクリーンで作成されたデータです。 こちらの方法を使用いたしますと、 g.setOriginで指定された軸を中心に画像が回転してしまいます。 画面中心を軸として画面全体が回転する方法が見つかりません。 ご存知の方、お教え下さい。

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

  • ベストアンサー
  • alphion
  • ベストアンサー率19% (27/136)
回答No.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; }

d-mme
質問者

お礼

ありがとうございます。 画面中央を軸に画像が回転するようになりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • alphion
  • ベストアンサー率19% (27/136)
回答No.1

見ていないのでわかりませんが、回転の部分しか設定をしていないのだと思います。 2次元アフィンの式のm02,m12の設定も含めてちゃんと設定すれば出来ると思います。

d-mme
質問者

補足

申し訳ありませんでした。 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次元アフィン作成関数です。 これをどのように変換したらいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 独楽の軸の中心の回転について

    実際回転している独楽の軸の中心は一定の面積で平面と接していると思いますが、数学的には面積がない点で接しているということになるのでしょうか。このような数学的独楽に関連して点の回転のイメージは素人にはつかめないものなのでしょうか。

  • 任意軸周りの回転について

    任意軸周りの回転について 実はプログラムのバグがどうしてもわからず、相談させていただきます。 結果は期待とおりの結果になりません。 図々しいお願いですが、ぜひ間違いをご指摘願います。 3次元座標上に数個の点があり、それを線分で結びます。 ある点をPiとするとしたとき線分(Pi-1,Pi)と(Pi,Pi+1)のなす 角度を180度にしたいのです。そしてPiをデータの並びから 外します。つまりPiでの曲げをキャンセルというイメージです。 任意の軸に対する回転の座標を変換の公式を使用しています。 以下のurlにソースがあります。 http://1st.geocities.jp/kanna_sakura_hana/rotation/header.cpp http://1st.geocities.jp/kanna_sakura_hana/rotation/draw.cpp 実行したい変換のイメージは http://1st.geocities.jp/kanna_sakura_hana/rotation/sample.jpg に図示してあります。 FormCreateのイベント関数に座標変換部分のソースが書かれて います。 ぜひご教授願います。 なお、任意軸周りの回転行列は「ゲーム3D数学」を参考にしました。

  • パネルの絵の差し替え方法

    JBuilderでJavaの開発を勉強しています。 パネルがクリックされるたびに、パネルに張られている絵を差し替えたいのですが最初の2回のクリックではパネルの絵が消えてしまい3回目からのクリックでは問題なく絵は切り替わります。下記のロジックで問題があるのでしょうか? メインフレームのパネルクリックイベントから"public void ChangeImage(int num)"関数を呼びます。 ************************************************* public class New_Panel extends Panel { Image img; Image im_off; Image im_on; //CONSTRUCT public Panel_FD() { im_off = Toolkit.getDefaultToolkit().getImage("OFF.jpg"); im_on = Toolkit.getDefaultToolkit().getImage("ON.jpg");   //初期イメージ img = Toolkit.getDefaultToolkit().getImage("ON.jpg"); } public void paint(Graphics g){ g.drawImage(img, 0, 0, this); } //イメージ変更 public void ChangeImage(int num){ Graphics g; img.flush(); img = this.createImage(100, 40); if (sw == 0) { g = img.getGraphics(); g.drawImage(im_off, 0, 0, this); } else { g = img.getGraphics(); g.drawImage(im_on, 0, 0, this); } //再描画 repaint(); } } *************************************************

    • ベストアンサー
    • Java
  • 回転軸のたわみ量

    教えて下さい。 軸が横を向くようにモーターを横置きし、Φ12mmのSUS304製の軸が63mm伸びており、その先にΦ40X60mmのSUS304製円筒がついており、モーターを300rmpの速さで回転させた場合、回転軸の回転中心線からのたわみ(変位)量は?mmになるのか、またその計算方法も教えていただけませんでしょうか。回転軸と円筒体は中心で溶接されています。 宜しく御願い致します。

  • 任意軸ベクトル周りの3次元座標回転

    任意軸ベクトル周りの3次元座標回転 任意軸周りの回転について 実はプログラムのバグがどうしてもわからず、相談させていただきます。 結果は期待とおりの結果になりません。 図々しいお願いですが、ぜひ間違いをご指摘願います。 3次元座標上に数個の点があり、それを線分で結びます。 ある点をPiとするとしたとき線分(Pi-1,Pi)と(Pi,Pi+1)のなす 角度を180度にしたいのです。そしてPiをデータの並びから 外します。つまりPiでの曲げをキャンセルというイメージです。 任意の軸に対する回転の座標を変換の公式を使用しています。 以下のurlにソースがあります。 http://1st.geocities.jp/kanna_sakura_hana/rotation/header.cpp http://1st.geocities.jp/kanna_sakura_hana/rotation/draw.cpp 実行したい変換のイメージは http://1st.geocities.jp/kanna_sakura_hana/rotation/sample.jpg に図示してあります。 FormCreateのイベント関数に座標変換部分のソースが書かれて います。 ぜひご教授願います。 なお、任意軸周りの回転行列は「ゲーム3D数学」を参考にしました。

  • 3次元座標を原点中心に回転したい

    任意のゼロでないベクトル(a,b,c)を原点中心に回転し、z軸に合致させるとする。同じ回転移動を3次元座標上の任意の点(x,y,z)に対して行った時の移動後座標が知りたいのです。 計算と結果を教えて下さい。

  • 3次元ベクトルをある軸ベクトルで回転させたい

    3次元ベクトルの求め方を教えてください。 下記図のように始点を軸ベクトルでθ(度)だけ回転したときの?の位置を求めたいのです。 これはどのような計算方法になるのでしょうか?なかなか思いつかなくて非常に悩んでいます。 アドバイスや回答をいただけたら助かります。よろしくお願いします。

  • 回転した座標軸と一致させるための回転軸と角度の算出

    こんにちは。お知恵をお借りしたく質問致します。 プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。 ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。) 図のように、xyz座標を回転してXYZ座標の向きに一致させたいと考えています。 また、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数があるので、それを活用しようと考えています。α,β,γはコサイン値(方向余弦)です。回転方向は、ベクトルの向きに時計回り…右ネジの法則みたいな感じです。 x軸から見たXの角度(θxX), y軸からのX(θyX), z軸からのX(θzX) 同様にx軸から見たY(θxY),θyY,θzY、θxZ,θyZ,θzZ といったように、それらの角度(コサイン値)は分かっています。 (=xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっている。) z軸とZ軸の外積を取ったベクトルを回転軸として、θzZが分かっているのでその角度で回転することでZ軸は一致しますけど、XY軸は合いません。(当然ですが…) そのXY軸を合わせるためにまた回転するというのも遠回りで、任意の軸1本を中心に何度か回転するだけ(上記関数を1度使用するだけ)で、必ず向きが一致する解があると思うのですが、その任意軸と角度を算出する方法が分かりません。 一般にどういう計算をするのでしょうか。アドバイスいただければ幸いです。 なお、上記関数を用いない方法でも構いません。 「X軸(Y軸、Z軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • X軸・Y軸が回転してしまいました。

    AutoCAD2000iを使用しています。 印刷画面をプレビューした際にエラーがかかり、終了しました。 ファイルを開くと「図面ファイルの修復が必要です。続けますか?」と聞かれますが、修復された画面は時計回りに90度回転した状態になってしまいました。 描かれた図だけではなく軸自体がずれていて、    → Y   ↓   X という表示になっています。 元に戻すにはどうしたらよいのでしょうか。

  • 回転後の座標について 5軸加工機

    今年中に、OKKの縦型マシニング機械(三菱Neomatic)に日研のNCインデックス(角度と回転ができる仕様)を載せる予定です。 使いやすくするため、テーブル回転後の座標を、変数で計算ができるプログラムを作っているのですが、うまくいかず頭をかかえてる毎日であります。 そこで、皆様の力をお願いしたく質問させていただきます。 私の希望としては、 #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) 上記、G54座標中心からずれた数値(#101から#103)から、回転&角度(#104、#105)の数値を変更するだけで、ひねった後の座標を計算し、その答えをG55の座標系に入れるプログラムを作っているのですが、いくつか問題がある為うまくいきません。 ◎G54のワーク座標がテーブル回転中心ではない。 ◎G54のワーク座標の中心位置から、さらにずらした位置を回転させたい。 ◎X,Y,Z及び、回転軸C、角度軸A 共にプラス数値とマイナス数値があり計算が困難。 ◎回転軸C、角度軸A 共に90度以上回る。 この様な原因があり、電卓で計算した数値と変数で計算させた数値が違い、困った次第であります。 機械の特徴としては、 ◎機械座標はマイナス数値 ◎テーブル回転中心座標は#501=X #502=Y #503=Z に登録済み。 ★☆まとめ☆★ #5221=G54X座標 #5222=G54Y座標 #5223=G54X座標 を使い #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) で移動させた数値の答えを #5221=G54X座標 #5222=G54Y座標 #5223=G54Z座標 に登録したい。 文章が下手で申し訳ありませんが、どなたか変数を使い回転後の座標が計算できるプログラムをお教え下さい。 不明な点等ございましたらお教え下さい。 大変困っているので宜しくお願いします。 まとめの部分を下記の様に修正いたします。 ★☆まとめ☆★ #5221=G54X座標 #5222=G54Y座標 #5223=G54X座標 を使い #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) で移動させた数値の答えを #5241=G55X座標 #5242=G55Y座標 #5243=G55Z座標 に登録したい。