ページ 11

画面上に設置したジョイスティックからの入力

Posted: 2013年4月19日(金) 08:10
by 節穴
画面上に設置したジョイスティックをマウスで掴んで移動できるようにし、

ジョイスティックの現在位置から8方向で判定したいのですが、

どのようなアルゴリズムを用いたらいいでしょうか?

アイディアをいただけると助かります。

画像

Re: 画面上に設置したジョイスティックからの入力

Posted: 2013年4月19日(金) 09:25
by ホヅミ
先ほどの記事なのですが、自分の勘違いで見当違いなことを書いた+再編集しようとしたら誤って削除してしまいました。
マウスでのジョイスティックだったのですね^^;申し訳ございません。

1.図での青○をつかんでいないときは青○を中心に固定させます。
2.青○からの移動量をXY座標で持ってきます。
3.原点と青○XYから角度を計算します。
4.角度からジョイスティックの方向を決定させます(簡単なのは360/8?)

こういった考え方でどうでしょうか?

Re: 画面上に設置したジョイスティックからの入力

Posted: 2013年4月19日(金) 10:45
by softya(ソフト屋)
中心からの相対座標からatan2で角度を出して、角度で方向を判定すれば良いんじゃないでしょうか?

Re: 画面上に設置したジョイスティックからの入力

Posted: 2013年4月19日(金) 17:32
by ISLe
二次元の外積(※)計算で、現在位置が直線の時計回り方向にあるか反時計回り方向にあるか判定できます。
各直線について計算して挟まれているのが求める場所というふうにできるかと思います。

角度を求めるより計算量は少なくなると思いますがコードは複雑になります。


※正しくは二次元の場合外積ではないのですが、適当な名称がないのでこのように表現します。

Re: 画面上に設置したジョイスティックからの入力

Posted: 2013年4月19日(金) 18:09
by usao
・「角度」をわざわざ算出しなくとも,
 単に 中心→現在位置 ベクトルの傾き(Y/X) が各領域の範囲内にあるかから判定すればよいのではないでしょうか.

・あるいは,傾き計算で0での除算の扱いが嫌な場合は,各方向との内積の値でみるとか.
 例えば「右」なのかを調べたければ
 中心→現在位置 ベクトルを単位ベクトル化したもの と 右方向ベクトル(1,0) との内積の値が cos( 360/8[度] ) 以上かどうかを見る.

Re: 画面上に設置したジョイスティックからの入力

Posted: 2013年4月19日(金) 21:15
by みけCAT
ISLe さんが書きました:二次元の外積(※)
※正しくは二次元の場合外積ではないのですが、適当な名称がないのでこのように表現します。
二次元のベクトルをz成分が0である三次元のベクトルとみなした時の外積のz成分のことですか?

Re: 画面上に設置したジョイスティックからの入力

Posted: 2013年4月20日(土) 07:25
by 節穴
ホヅミさん、softyaさん、ISleさん、usaoさん、みけCATさん

ご教示いただきまして、ありがとうございました。

今回は角度から方向を求めるメソッドを採用したいと思います。

ぺこり

コード:

#include <math.h>

// なんやかんやで原点からの相対座標( y, x )を取得

float angle;

angle = atan2 ( y, x ) / PI * 180.0f;	// 座標から角度を求める

if ( -22.5f <= angle && angle <= 0.0f || 0.0f <= angle && angle <= 22.5f )
{
	printf("「上」方向と判定しました。\n");
}

// …以下、45°ごとに8方向を順々に判定していく