ページ 1 / 1
2点間の距離の角度を求めたい
Posted: 2010年10月18日(月) 23:20
by ラッド
2点間の距離の角度を求めたいのですが上手くいきません・・・。
int dx = x1 - x2;
int dy = y1 - y2;
float r = atan2( dx, dy ); // ←-1~1で返ってくる
r = r * (180/M_PI);
これを0~360にしたいです。
Re:2点間の距離の角度を求めたい
Posted: 2010年10月18日(月) 23:35
by box
>// ←-1~1で返ってくる
本当ですか?
Re:2点間の距離の角度を求めたい
Posted: 2010年10月19日(火) 00:07
by 霜焼け
まず、atan2関数の引数は(y軸方向の移動量,x軸方向の移動量)です。
なので、この場合はatan2(dy,dx)としなければなりません。
/*
次に、 r=r*(180/M_PI);ではなく、 r=r*(M_PI/180);
1度はπ/180です。
*/
勘違いから嘘書いてしまいました。すみません。
r=r*(180/M_PI);のままで正しいです

Re:2点間の距離の角度を求めたい
Posted: 2010年10月19日(火) 00:17
by box
> なので、この場合はatan2(dy,dx)としなければなりません。
気がつきませんでしたね。
> 1度はπ/180です。
それはそうなんですが、atat2の結果(ラジアン)から度に変換したいのですから、
> 次に、 r=r*(180/M_PI);ではなく、 r=r*(M_PI/180);
これはおかしいでしょう。
Re:2点間の距離の角度を求めたい
Posted: 2010年10月19日(火) 00:44
by 霜焼け
すみません、妙に勘違いしてました。修正しておきます。
Re:2点間の距離の角度を求めたい
Posted: 2010年10月19日(火) 00:46
by シエル
r=r*(180/M_PI);
これはあってますね。
Re:2点間の距離の角度を求めたい
Posted: 2010年10月19日(火) 03:54
by ラッド
皆様、色々とありがとうございます。
あれから色々と弄ってみたのですが動かしたいように動いてくれません。
わかりにくいと思いますのでやろうとしていることを書かせて頂きます。
OpenGL ES2.0(iPhone)で作っております。
隕石を惑星(目的地)にぶつけないように弾いていくといったゲームを作っております。
下記の仕様で作ってみてはいるのですが上手く動きません。
1、ランダムな位置に石が表示されます。
2、初期に設定されたTarget座標に向かって進みます。
3、Target座標を到達すると停止します。
4、オブジェクトにはタッチすることができ弾く?ことができ弾いた方向に飛んでいきます。
現在のソースでは指定した方向に進んでくれません。
どなたかお分かりになる方いらっしゃりませんでしょうか?
bool Flag; // 出現フラグ
int Rot; // 表示するときに使う角度
float Dir; // 移動する方向
int Mode; // 今回は関係ありません
int Px,Py,Ox,Oy; // 現在座標、前座標
bool touchFlag; // 一度でもタッチされたか →タッチされたら目的地ではなく弾かれた方向へ
int TargetX, TargetY; // 目的地
int width,height; // 今回は関係ありません。
void Init( bool Flag, int Mode, int Rot, int Px, int Py ); // 初期化
bool AreaOut(void); // 画面外にあるかの判定
bool Touch(void); // 触られているかの判定
void TouchObject(void); // 触られたらどんなことが起こるか
System.touchX; System.touchY; // タッチされている座標
一部、切り取ったソースを添付させて頂きます。
Re:2点間の距離の角度を求めたい
Posted: 2010年10月19日(火) 19:52
by 迷彩吹雪
はっきりと読み解いたわけではありませんが、static void Loop()内の
int dx = Storn.Ox - Storn.Ox;
これだとdxは常に0になりませんか?
Re:2点間の距離の角度を求めたい
Posted: 2010年10月19日(火) 23:01
by ラッド
見ていてありがとうございます。
本当ですね・・・。間違えてました。
後、一か所間違えておりました。
Storn.Px += cos( Storn.Dir ) * STORN_SPEED;
Storn.Py += sin( Storn.Dir ) * STORN_SPEED;
↓
Storn.Px += cos( Storn.Dir*(M_PI/180) ) * STORN_SPEED;
Storn.Py += sin( Storn.Dir*(M_PI/180) ) * STORN_SPEED;
初期に指定した方向には行けるのですが
タッチ後に弾くような処理をすると-90という謎の値がDirに入っております。
タッチを離した時にのみ反応するフラグ(System.pulFlag)を作って
その時のみDirを変更するようにしてみたのですが
それでもDirに入っている値がおかしいです。
Re:2点間の距離の角度を求めたい
Posted: 2010年10月20日(水) 00:16
by box
> タッチ後に弾くような処理をすると-90という謎の値がDirに入っております。
x座標に変化がない、という判断を行なっているのではないでしょうか。
> タッチを離した時にのみ反応するフラグ(System.pulFlag)を作って
> その時のみDirを変更するようにしてみたのですが
> それでもDirに入っている値がおかしいです。
pulFlagというのは初登場ですね。
前に添付してあったコードにも見当たらないようです。
そのフラグをどんな風に使っているのでしょうか。
ところで、最初の投稿にあった、atan2の結果が-1~1の範囲である、
という判断の根拠はどこにありますか?
Re:2点間の距離の角度を求めたい
Posted: 2010年10月20日(水) 07:47
by へろりくしょん
添付されたコードは見てませんが。
そもそも、2点間の距離の角度というのは何でしょうか。
2点間の距離から角度を求めるのでしょうか。 よく分かりません。
角度を求めるには最低でも3つの頂点が必要です。
要求仕様を明確にすると、混乱も少ないかと。
Re:2点間の距離の角度を求めたい
Posted: 2010年10月20日(水) 12:43
by 通りすがりのプログラマ
こんなんでどうでしょうか。
while ( 1 )
{
if (r < 0) r += 360;
else if (r > 360) r -= 360;
else break;
}
Re:2点間の距離の角度を求めたい
Posted: 2010年10月20日(水) 22:20
by ラッド
>>boxさん
添付したものにソースは書いておりません。
System.pulFlagというbool型の変数があり
タッチされ離された瞬間のみtrueになります。
>>ところで、最初の投稿にあった、atan2の結果が-1~1の範囲である、
>>という判断の根拠はどこにありますか?
すみません・・・どこかのURLでみたのですがその値が入るようなことが書いてあった気がします。
違っていたらすみません。
>>へろりさん
2点間の距離では分かりにくかったですね・・・。
A点からみてB点がどちらの方向にあるかを0~360で求めたいです。
真右にある場合は0といった感じです。
>>通りすがりのプログラマさん
Dir++等をしていないので本来なら0~360の値しか入らない気がします。
多分atan2の使い方が悪いのかと思うのですが・・・