現在の角度によって時計回りに回転するか反対周りに回転するかを判断する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
翔子

現在の角度によって時計回りに回転するか反対周りに回転するかを判断する

#1

投稿記事 by 翔子 » 14年前

現在の角度によって時計回りに回転するか反対周りに回転するかを判断するような処理をしたいです。

this->Rot 現在の角度 0~360度
this->Angle 0~4の値が入ります。
      目標の方向  0なら↑ 1なら→ 2なら↓ 3なら←

特定の処理をするとthis->Angleの値が変わります
現在のソースでは時計回りにしか回転しません。
どのように逆向きに回転させるかを判断させればいいのかがわかりません・・・
宜しければご助言を頂けないでしょうか
Rotation(void){
    // 回転
    if( this->Rot != this->Angle * 90 && Mode == M_NORMAL ) this->Rot += 3;
    else this->Rot = this->Angle * 90;

    // 回転の範囲 0~360
    if( this->Rot >= 360 ) this->Rot -= 360;
    if( this->Rot < 0 ) this->Rot += 360;

}

めるぽん

Re:現在の角度によって時計回りに回転するか反対周りに回転するかを判断する

#2

投稿記事 by めるぽん » 14年前

Angle が 0 の場合、
 Rot が 0~180 なら反時計回り
 Rot が 180~360 なら時計回り
Angle が 1 の場合、
 Rot が 90~270 なら反時計回り
 Rot が 0~90 または 270~360 なら時計回り
Angle が 2 の場合、
 Rot が 180~360 なら反時計回り
 Rot が 0~180 なら時計回り
Angle が 3 の場合、
 Rot が 0~90 または 270~360 なら反時計回り
 Rot が 90~270 なら時計回り

というのを素直に実装するか、もしくは
int n = Rot - Angle * 90;
if(n < 0) n += 360;

if (n < 180) Rot -= 3;
else Rot += 3;
としてもいいかもしれません(確認してないのでちゃんと動かないかもしれませんけど)。
やっていることは、Rot を Angle * 90 度ずつ回転させることで、Angle が 0~3 のケース全部を Angle == 0 と同じ処理で出来るようにしています。

nns

Re:現在の角度によって時計回りに回転するか反対周りに回転するかを判断する

#3

投稿記事 by nns » 14年前

書き込みの内容だけでは目的が今ひとつはっきりしませんが
現在の角度を目標の方向に近い方で回転させるという意味だとしたら
現在の角度と目標の方向を三角関数に放り込んで2次元のベクトルを作り、
外積の符号を見るとよろしいかと思います。

翔子

Re:現在の角度によって時計回りに回転するか反対周りに回転するかを判断する

#4

投稿記事 by 翔子 » 14年前

ぬるぽんさん
ありがとうございます!!
問題なく解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る