• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:続、VB 座標軸の回転?)

VB座標軸の回転で渦巻き状に広がる問題

このQ&Aのポイント
  • VB座標軸の回転で広がってしまう問題の解決方法を教えてください
  • VB座標軸の回転による渦巻き状広がりの修正方法について教えてください
  • VB座標軸の回転で広がる現象を解消する方法を教えてください

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

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.13

そんなにおかしそうには思いませんが、気がつかないバグが潜んでいるのかなあ。 デバッガを使えば簡単なのですが、timerを使わずに、sleepなどの実行を遅らせる命令があれば、それ入れ、ループで回せばデバッガを使えるようになりませんかねえ。 それか、Timerやジョイスティックに依存しないサブルーチンを作ってユニットテストする方法もあります。 No.7に書いたプログラムは、ジョイスティック部分を除いて簡単なユニットテストをしております。複雑な動作はテストされていませんので思わぬ勘違いが潜んでいる可能性も無いとは言えませんので、後でもう少し複雑なテストをしてみます。 No.12に書いたDimの移動ですが、ブロックの中で宣言した場合には変数の寿命がブロックの寿命より長くなり、スコープと一致しないので、ブロックの外に出してスコープと変数の寿命が一致するほうが分かりやすいと思ったのですが、VBって変数の寿命はかなり複雑ですね。 プログラムの実行中に確実に一回しか初期化されないところに移動した方が間違いを防げるかもしれません。 VBのマニュアルざっと見ましたが、初期化はコンパイル時に行われるような記述が有ります。 Dim afLs(,) As Single = {{Cos_step, -Sin_step, 0.0}, {Sin_step, Cos_step, 0.0}, {0.0, 0.0, 1.0}} '左 は、コンパイル時にCos_step, Sin_stepは確定しているはずなので、値として大丈夫なはずですが、どうなのでしょうか。 デバッガを使えるようにプログラムを少し変更してテストするのが近道のような気がします。

sabrina485
質問者

お礼

行列式を解体して一つ一つの計算式にしたところ無事に動きました! 行列ではなくなったので、●の数を増やすことは困難になりましたが無事に完成のようです。 ありがとうございました!!

その他の回答 (12)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

No.1の訂正です。 >そして、移動・回転・リーダーの行ベクトルで 行ベクトルではなく列ベクトルですね、 行列の積は、行列計算用のライブラリがあることが多いのですが、VBはあるかどうかはわかりません。 3x3の行列ですので簡単です、無ければサブルーチンを作れば良いのではないかと思います。 それとちょっと補足ですが、 まず元の図形のリーダーとメンバーはX軸方向を進行方向とするようにします。 そして移動1をX方向だけの移動にします。(そして徐々に移動量を大きくして) 回転1・移動1・リーダーの列ベクトル(あるいはメンバーの列ベクトル)を計算すると、回転1の方向にリーダーを先頭に移動することができます。 また、回転1・移動1・回転2・リーダーの列ベクトルで、回転2だけを変化させます。 さらに、回転1・移動1・回転2・移動2・リーダーの列ベクトルで移動2だけを変化させます。(移動は全てX軸方向だけ) いろいろやってみてください。面白い結果がでるはずです(実際には確認していないので、間違いがあるかも知れませんが、今日の調子の悪い頭の中では完成しています??)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

前回の質問のNo.2です。 ちょっと質問欄の式を眺めていたのですが、今日の私の状態では理解不能なので、アフィン変換での説明をします。 前回のよりは多少分かり易そうなのがあったのでリンクしておきます。 http://imagingsolution.blog107.fc2.com/blog-entry-284.html 平行移動の所の、Tx, Tyをcx, cyとして、回転のθをAにして、右の項のx, yを例えば1, 0にします。 (中心0,0が回転中心で、リーダーの位置を1,0にしています。(適宜変えてみてください) そして、移動・回転・リーダーの行ベクトルで行列計算します。(要するにリーダーを回転した後で平行移動する) それで角度Aを変化させてみてください。cx, cyを中心にして、半径1できれいに回転するするはずです。 メンバーの位置も入れてみてください。こちらもきれいにできるはずです。 この場合のコツは、x,yに相当するリーダーやメンバーの座標を変えないで、位置はアフィン変換行列の移動や回転のパラメータだけを変化させて決めます。 また途中から進行方向が変わる場合も、移動・回転・移動・回転・リーダーの行ベクトルの様に変換を重ねていくと、複雑な動きも簡単にできるはずです。

sabrina485
質問者

補足

前回に引き続きご回答ありがとうございます! このプログラムはTimerを使ってずっと回しています。 アフィン変換の行列をVBで再現するときは X' = X*cosA - Y*sinA + Tx Y' = X*sinA + Y*cosA + Ty とプログラムすれば良いのでしょうか? これを関数化してリーダー、付属の○それぞれの(X,Y)座標を渡して結果を表示すればいいのか、それとも(X,Y)は隊形の中心からの相対座標なのかと悩み中です。 質問に書いたプログラムですが、わかりづらくてすいません。 詳しく解説すると、上のプログラムはリーダーの部分だけを抜粋しました。 まず回転するために隊形の中心部分を原点としました。(cx、cy) 隊形の三角形の中心部分(cx,cy)を原点とし、それからリーダーがどこにいるかの相対座標(xx,yy)を計算するために現在地(x0,y0)から引きました。 xx = x0 - cx (隊形の中心を原点とした回転後の座標) それから、回転変換の式を使って回転後の座標(x,y)を計算し、それに引いた座標(cx,cy)を足して本当の回転後の座標を出しました。 x= xx * cosA - yy * sinA + cx yも同様に出し表示させると、前進するときはいいのですが、回転させると3体の○が渦巻きのように広がっていきます。 質問が多くてすいません。 わかる範囲だけでいいのでご回答していただけると助かります。

関連するQ&A