DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン 2つのradの数値から1つの角度を求めるコードを改善できますか?(C++) /キリシロ (23/12/01(Fri) 19:19) #35556
Nomalアイコン Re[1]: 2つのradの数値から1つの角度を求めるコードを改善できますか?(C++) /kiku (23/12/11(Mon) 09:34) #35557
  └Nomalアイコン Re[2]: 2つのradの数値から1つの角度を求めるコードを改善できますか?(C++) /キリシロ (23/12/11(Mon) 16:54) #35558 解決み!


親記事 / ▼[ 35557 ]
■35556 / 親階層)  2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)
□投稿者/ キリシロ 一般人(1回)-(2023/12/01(Fri) 19:19:45)
  • アイコン環境/言語:[環境(エディション:Windows 11 Home バージョン:21H2)、使用言語(C++)、使用ソフト(Visual Studio 2022)] 
    分類:[.NET] 

    <目的>
    すでに、コードは完成したが角度を求める式を改善できるのではないかと思う。

    <このコードの目的>
    操作するためのキー入力(縦方向と横方向)を取得した際に、この二つの値(rad)を送ると操作対象の進行方向を0〜360度の間で求める関数を作成したい。

    <このコードの考え>
    rtanは、下が-1からはじまり、上の1までの縦軸の値と考える
    1

    rtan

    -1
    rcosは、左が-1からはじまり、右の1までの横軸の値と考える

    -1 → rcos → 1

    そうすることでこの二つの変数は十字の関係になり、角度が求められる。

    ................1
    ..............↑
    -1 → angle → 1
    ..............↑
    ..............-1

    ................90
    ................↑
    180 → angle → 0
    ................↑
    ..............270

    <送られてくる変数の範囲>
    -1.0 <= rtan,rcos <= 1.0

    <コード>
    double Function::AfTC(double rtan, double rcos)
    {
    double ctan = atan(rtan) * (double)180 / PI;
    double ccos = acos(rcos) * (double)180 / PI;
    double angle = (ccos == (double)0 ? (ctan < (double)0 ? (double)360 + ctan : ctan) : (ccos - ctan) * ((double)180 / ccos));
    return angle;
    }

    <入力例>
    1:rtan = 1.0, rcos = 0.0
    2:rtan = 0.0, rcos = -1.0
    3:rtan = -1.0, rcos = 0.0
    4:rtan = 0.0, rcos = 1.0
    5:rtan = 1.0, rcos = -1.0
    6:rtan = 1.0, rcos = 1.0
    7:rtan = -1.0, rcos = 1.0

    <出力例>
    1:angle = 90
    2:angle = 180
    3:angle = 270
    4:angle = 0
    5:angle = 135
    6:angle = 45
    7:angle = 315

    <追記>
    一通り注意事項を読んで投稿しましたが、足りていない部分がありましたらご指摘のほどよろしくお願いいたします。
違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 35556 ] / ▼[ 35558 ]
■35557 / 1階層)  Re[1]: 2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)
□投稿者/ kiku 一般人(3回)-(2023/12/11(Mon) 09:34:48)
  • アイコンNo35556に返信(キリシロさんの記事)

    下記の考え方で計算できそうです。

    rcosをXとする。rtanをYとする。
    X、Y共に、-1.0から+1.0の値を取るとする。
    2次元平面上に、点(X,Y)をプロットし、
    その点までの角度を求める。

    ●X=0の場合
    ・Y>0ならば、90[度]
    ・Y=0ならば、0[度]
    ・Y<0ならば、270[度]

    ●X>0の場合
    ・Y>=0ならば、ATAN(Y/X)*180/PI[度]
    ・Y<0ならば、ATAN(Y/X)*180/PI+360[度]

    ●X<0の場合
    ・ATAN(Y/X)*180/PI+180[度]

違反を報告
[ 親 35556 / □ Tree ] 返信 削除キー/

▲[ 35557 ] / 返信無し
■35558 / 2階層)  Re[2]: 2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)
□投稿者/ キリシロ 一般人(2回)-(2023/12/11(Mon) 16:54:03)
  • アイコンkikuさん、返信ありがとうございます。
    「送られてくる2つの変数を座標の点として見る」という考え方にまさにその通りと、思いました。
    それと、その考え方を元にコードを書いてみましたが、問題なく動作しましたし、コードも見やすくなりました。
    一応、書いたコードを載せて置きます。
    <コード>
    double Function::AfTC(double y, double x)
    {
    double angle;

    if (x > 0.0)
    {
    if (y < 0.0)
    angle = atan(y / x) * 180.0 / PI + 360.0;
    else
    angle = atan(y / x) * 180.0 / PI;
    }
    else if (x < 0.0)
    {
    angle = atan(y / x) * 180.0 / PI + 180.0;
    }
    else
    {
    if (y > 0.0)
    angle = 90.0;
    else if (y < 0.0)
    angle = 270.0;
    else
    angle = 0.0;
    }

    return angle;
    }
解決み!
違反を報告
[ 親 35556 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -