C言語関数:atan2





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■atan2
y/x逆正接の計算

【分類】
数学関数

【書式】
double atan2(double y, double x);

【パラメータの型と説明】

パラメータ説明
double y
double x

【機能説明】
y/xの逆正接(アークタンジェント)を-π/2〜π/2の範囲で返します。
atan関数ではxが非常に大きいときは正確な値が得られないことがあります。
xが大きいときはatan2を使ってください。

atan()関数と同じように使ったことがありません。 ちょっと調べて見るとx、yの座標を指定してx軸からの角度(ラジアン)を求める使い方が紹介されていたので試してみようと思います。

Study Cを使用している場合は、下記のようにコマンドラインから実行(exprコマンドを使用)して動作を確認することができます。

C:\StudyC\MyProg>expr atan2(sqrt(3.0), 1.0) * 360.0 / (2.0 * 3.14159265358979)
<double>60

C:\StudyC\MyProg>expr atan2(1.0, sqrt(3.0)) * 360.0 / (2.0 * 3.14159265358979)
<double>30

C:\StudyC\MyProg>expr atan2(10.0, 10.0) * 360.0 / (2.0 * 3.14159265358979)
<double>45

※↑カーソルキーを押すと入力したコマンドが呼び出されるので文字を変更して試してみてください。
1番目は、3の平方根と1の比率なので60度が返されます。
2番目は、10と10(1:1)の比率なので45度が返されます。
1番目は、1と3の平方根の比率なので30度が返されます。

通常のコンパイラを使用する場合の使用例は下記になります(もちろんStudy CでもOKです)。

#include <stdio.h>
#include <math.h>

main()
{
        printf("%f\n", atan2(sqrt(3.0), 1.0) * 360.0 / (2.0 * 3.14159265358979));
        printf("%f\n", atan2(1.0, sqrt(3.0)) * 360.0 / (2.0 * 3.14159265358979));
        printf("%f\n", atan2(10.0, 10.0) * 360.0 / (2.0 * 3.14159265358979));
}

実行結果は以下になります。

30.000000
45.000000
60.000000

プログラムを実行するとatan2()関数(xを1.0に固定)のグラフを描画します。

#include <graph.h>
#include <math.h>

main()
{
        int     t;
        int     x, y, lx, ly;

        gl_openwin(-1, -1, 640, 400, 1);
        gl_line(0, 200, 639, 200, 1, 0, RGB(0, 255, 0));
        gl_line(320, 0, 320, 400, 1, 0, RGB(0, 255, 0));

        lx = ly = -1000;
        for(t = -320; t < 320; t++)
        {
                x = t + 320;
                y = -atan2(t/100.0, 1.0) * 120 + 200;
                if(lx != -1000 && ly != -1000)
                {
                        gl_line(lx, ly, x, y, 1, 0, RGB(255, 0, 255));
                }
                lx = x;
                ly = y;
        }
}

このサンプルプログラムを実行すると次のようなグラフが表示されます(atan()と同じグラフになります)。
atan関数のグラフ

【参照関数】
asin
acos
atan
sin
cos
tan
sinh
cosh
tanh