一周した時の(double)角度について
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
一周した時の(double)角度について
角度がPIを跨ぐとき方向などはどのようにして確認したらいいのでしょうか?
角度のデータはdouble型なので
-3.14~3.14の範囲で角度を表現しているのですが のようなコードを毎フレーム呼び出すと
範囲分岐に支障が出てしまいます。 分岐条件側でうまく回避することはできないでしょうか?
角度のデータはdouble型なので
-3.14~3.14の範囲で角度を表現しているのですが のようなコードを毎フレーム呼び出すと
範囲分岐に支障が出てしまいます。 分岐条件側でうまく回避することはできないでしょうか?
最後に編集したユーザー LisetteLander on 2012年5月12日(土) 12:11 [ 編集 1 回目 ]
Re: 一周した時の(double)角度について
このangleという変数が最初のif文に入って値が変わります。
ところが次にangle>=PIのif文に引っかかってしまうのではないのですか?
そのため値は常に-PI*2となるのではないでしょうか?
Dango San
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
角度が180度を上回ったら-360度して-180度を表現しこのangleという変数が最初のif文に入って値が変わります。
ところが次にangle>=PIのif文に引っかかってしまうのではないのですか?
そのため値は常に-PI*2となるのではないでしょうか?
角度が180度を切ったら+360度して+180度を表現してます
なので、使用する値の範囲は2*PI~0(360度~0度)ではなく
PI~-PI(180度~-180度)までを使います。
Re: 一周した時の(double)角度について
角度が「ちょうどπ」の場合にどうしたいのか不明ですが、
後ろのif文にelseを付ければ解決する、という話ではないでしょうか。
間違っていたらすみません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
角度がちょうどPIの時必ず-PI*2になってしまいますね
そこはわかりやすいように直しておきます。
まぁ実際はあまり変わらないでしょうけど・・・
そこはわかりやすいように直しておきます。
まぁ実際はあまり変わらないでしょうけど・・・
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
質問内容を図にするとこんな感じです。
画像の文章が間違ってて
「角度Funから+-PI/2の範囲にAngleがあるかを判定したい」
です。すいません
画像の文章が間違ってて
「角度Funから+-PI/2の範囲にAngleがあるかを判定したい」
です。すいません
- 添付ファイル
-
- 無題.png (14.58 KiB) 閲覧数: 12083 回
Re: 一周した時の(double)角度について
おおおお
[修正] 解決チェックを外しておきました。他人のトピックを無意味にチェックマークする行為は大変失礼に当たります。ご遠慮ください。 by softya(ソフト屋)
[修正] 解決チェックを外しておきました。他人のトピックを無意味にチェックマークする行為は大変失礼に当たります。ご遠慮ください。 by softya(ソフト屋)
- tk-xleader
- 記事: 158
- 登録日時: 14年前
- 連絡を取る:
Re: 一周した時の(double)角度について
if(fabs(fmod(Angle - Fun,PI*2)) < PI/2)………
って判定式でいかがですか?
訂正
判定式の引数にミスがあったので訂正します。
って判定式でいかがですか?
訂正
判定式の引数にミスがあったので訂正します。
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
えーと、提示した角度Angleから範囲基準角度引いて、PI*2で割った余りをがPI/2以下の時
ってことだから・・・
そしたら画像のようになりました。
画像中央(PosX,PosY)から画面中に見える青色の○に対して範囲内か範囲外かを判定しています。
この時御土居色の線はFunから±PI/2の境界を表しています。 やはり下記のコードで変換されると判定できないんでしょうか
ってことだから・・・
printfDx("Fun(青線)の角度:%f\n",Angle);
printfDx("○への角度:%f\n",atan2((double)(HungUnitCharacter[i].GetPosY()-PosY),(double)(HungUnitCharacter[i].GetPosX()-PosX)));
if(fabs(fmod(Angle - atan2((double)(HungUnitCharacter[i].GetPosY()-PosY),(double)(HungUnitCharacter[i].GetPosX()-PosX)),PI*2)) < PI/2){
printfDx("現在PI/2範囲内です");
}
画像中央(PosX,PosY)から画面中に見える青色の○に対して範囲内か範囲外かを判定しています。
この時御土居色の線はFunから±PI/2の境界を表しています。 やはり下記のコードで変換されると判定できないんでしょうか
Re: 一周した時の(double)角度について
数学関数とキャラクター座標のY軸方向は一致してますか?
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
引数の順番ということでしょうか?
確かにatan2はy,xにひっくり返っていたので入力支援に従って記述しました。
もしくはY座標は画面下に行くに連れて大きくなるというのと
数学上ではY軸は画面上に行くに連れて大きくなるということでしょうか?
後者は意識してないですが・・・
確かにatan2はy,xにひっくり返っていたので入力支援に従って記述しました。
もしくはY座標は画面下に行くに連れて大きくなるというのと
数学上ではY軸は画面上に行くに連れて大きくなるということでしょうか?
後者は意識してないですが・・・
- tk-xleader
- 記事: 158
- 登録日時: 14年前
- 連絡を取る:
Re: 一周した時の(double)角度について
そもそもこのコードって、Angleを0≦Angle<PI*2の間に補正しているコードですよね。でしたら、次のように書かないとまずいのではないでしょうか?
if(Angle >= PI*2){
while(Angle >= PI*2){
Angle -= PI*2;
}
}else if(Angle < 0){
while(Angle < 0){
Angle += PI*2;
}
}
if(fmod(fabs(Angle - atan2((double)(HungUnitCharacter.GetPosY()-PosY),(double)(HungUnitCharacter.GetPosX()-PosX))),PI*2)) < PI/2)………
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
角度をマイナスにするのはやめたほうがいいんですか
あ、そうするとやっぱり余りを求めることでうまく動きそうですね
あ、そうするとやっぱり余りを求めることでうまく動きそうですね
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
あぁ・・・ISLe さんが書きました:数学関数とキャラクター座標のY軸方向は一致してますか?
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
描画座標のY軸の正方向は下ですから、数学関数に素直に従えば角度は右回りになります。sood さんが書きました:あぁ・・・ISLe さんが書きました:数学関数とキャラクター座標のY軸方向は一致してますか?
atan2の戻り値は-π~πの範囲で、画面の上方向がマイナスです。
角度を使って座標を求めるとき(左回りになるように)上下反転させたりしてないですか?
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
math.hの関数の引数のY成分を符合逆にしたら欲しい結果がでました。
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
if(fabs(Angle - atan2(-(double)(HungUnitCharacter.GetPosY()-PosY),(double)(HungUnitCharacter.GetPosX()-PosX)))<PI/2){}
(現在の角度-○への角度)の絶対値がPI/2以下の時
180度(-180度)をまたがない状態で綺麗に表現できる条件分岐だと思います。
しかし180度を跨ぐとNo:6の画像みたいに判定してくれなくなります。
また、言うのが遅れましたが角度は0~PI*2 ではなく-PI~PIを使いたいです。
(現在の角度-○への角度)の絶対値がPI/2以下の時
180度(-180度)をまたがない状態で綺麗に表現できる条件分岐だと思います。
しかし180度を跨ぐとNo:6の画像みたいに判定してくれなくなります。
また、言うのが遅れましたが角度は0~PI*2 ではなく-PI~PIを使いたいです。
- LisetteLander
- 記事: 147
- 登録日時: 14年前
- 住所: 東京
Re: 一周した時の(double)角度について
if(fabs(Angle - atan2(-(double)(HungUnitCharacter[i].GetPosY()-PosY),(double)(HungUnitCharacter[i].GetPosX()-PosX)))<PI/2){
tmp=fabs(Angle - atan2(-(double)(HungUnitCharacter[i].GetPosY()-PosY),(double)(HungUnitCharacter[i].GetPosX()-PosX)));
}else{
tmp=PI*2-fabs(Angle - atan2(-(double)(HungUnitCharacter[i].GetPosY()-PosY),(double)(HungUnitCharacter[i].GetPosX()-PosX)));
}
if(tmp<PI/2){
printfDx("前方180度以内にいる!");
}
printfDx("\n");
if(fmod(fabs(Angle - atan2(-(double)(HungUnitCharacter[i].GetPosY()-PosY),(double)(HungUnitCharacter[i].GetPosX()-PosX))),PI*2) < PI/2){
printfDx("tkmakwins15さんが前方180度以内にいる!");
}
でもこれって上の分岐と下の分岐の違いがよくわからないですけどどう違うんでしょうか