C言語で学ぶ!三角関数の基本と実践10選

C言語で三角関数を理解する方法C言語

 

【当サイトはコードのコピペ・商用利用OKです】

このサービスはASPや、個別のマーチャント(企業)による協力の下、運営されています。

記事内のコードは基本的に動きますが、稀に動かないことや、読者のミスで動かない時がありますので、お問い合わせいただければ個別に対応いたします。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10000時間以上』を満たすプログラマ集団によって監修されています。

はじめに

コンピュータサイエンスの学習を進める中で、三角関数の理解は重要な要素の一つです。

そのため、この記事ではC言語を使って三角関数を理解し、実際にプログラムに組み込む方法を10個の具体的な例を通して学びましょう。

具体的なコードとその説明、実行結果とその解説を提供しますので、初心者の方でも分かりやすい内容となっています。

●三角関数とは

○三角関数の概要

三角関数は、角度や三角形の比率に関連した数学的な関数で、物理学や工学、コンピュータサイエンスなど様々な分野で広く利用されています。

特にゲーム開発やグラフィックス、音響処理などの分野では三角関数が頻繁に利用されます。

○C言語での三角関数の扱い

C言語ではというライブラリを利用することで、三角関数を簡単に扱うことができます。

このライブラリにはsin、cos、tanといった基本的な三角関数から、asin、acos、atanといった逆三角関数まで、幅広い三角関数が含まれています。

●C言語での三角関数の使い方

○サンプルコード1:sin関数の使用

まずは、最も基本的な三角関数であるsin関数の使用方法を見ていきましょう。

下記のコードでは0から360度までのsin関数の値を出力します。

この例ではループを使って度数を増やし、sin関数を計算しています。

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

int main() {
    for(int i = 0; i <= 360; i++){
        double radian = i * (M_PI / 180.0);
        printf("sin(%d) = %f\n", i, sin(radian));
    }
    return 0;
}

このコードを実行すると、各度数のsin関数の値が出力されます。

度数をラジアンに変換するためには、度数にπ/180を掛けることで実現できます。

これにより、0から360度までのsin関数の値を計算しています。

○サンプルコード2:cos関数の使用

次にcos関数の使用方法を見てみましょう。

下記のコードでは0から360度までのcos関数の値を出力します。

sin関数と同様に、この例でも度数をラジアンに変換してからcos関数を計算しています。

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

int main() {
    for(int i = 0; i <= 360; i++){
        double radian = i * (M_PI / 180.0);
        printf("cos(%d) = %f\n", i, cos(radian));
    }
    return 0;
}

このコードを実行すると、各度数のcos関数の値が出力されます。

sin関数と同じく、ラジアンに変換した値を用いてcos関数を計算しています。

○サンプルコード3:tan関数の使用

tan関数の使用方法も確認してみましょう。

下記のコードでは0から360度までのtan関数の値を出力します。

ただし、tan関数は90度と270度で無限大になるため、これらの値は計算から除外します。

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

int main() {
    for(int i = 0; i <= 360; i++){
        if (i % 180 == 90) {
            continue;
        }
        double radian = i * (M_PI / 180.0);
        printf("tan(%d) = %f\n", i, tan(radian));
    }
    return 0;
}

このコードを実行すると、各度数のtan関数の値が出力されます。

しかし、90度と270度のときはtan関数の値が無限大になるため、これらの度数を計算から除外しています。

○サンプルコード4:逆三角関数の使用

逆三角関数は、ある値から角度を求めるために使用します。

下記のコードでは、0.0から1.0までの値から、その逆sin、逆cos、逆tanの値を出力します。

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

int main() {
    for(double i = 0.0; i <= 1.0; i += 0.1){
        printf("asin(%f) = %f, acos(%f) = %f, atan(%f) = %f\n", i, asin(i), i, acos(i), i, atan(i));
    }
    return 0;
}

このコードを実行すると、0.0から1.0までの値の逆三角関数の値が出力されます。

これにより、逆三角関数を使って特定の値から角度を求めることができます。

●三角関数の応用例

C言語と三角関数の組み合わせは、驚くほど多くの応用可能性を持っています。

それでは、その一部を紹介します。

○サンプルコード5:sinとcosを用いた円の描画

三角関数を使うと、幾何学的な図形を描画することも可能になります。

ここでは、sinとcos関数を使って円を描く方法を紹介します。

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

#define PI 3.14159265

int main() {
    for (double theta = 0; theta <= 360; theta += 10) {
        double radian = theta * PI / 180;
        double x = 10 * cos(radian);
        double y = 10 * sin(radian);
        printf("(%.2f, %.2f)\n", x, y);
    }
    return 0;
}

このコードでは、0度から360度までの角度(θ)を取り、それぞれについてxとyの座標を計算しています。

ここでxとyは、それぞれ円の中心からの水平方向と垂直方向への距離に相当します。角度は10度ずつ増えていきます。

このようにして出力された座標の組を順にプロットすると、10単位の半径を持つ円が描かれます。

○サンプルコード6:tanを用いた直角三角形の角度計算

三角関数は、直角三角形の辺の比を利用した角度計算にも役立ちます。

tan関数は、対辺と隣辺の比(つまり、勾配)から角度を導き出すことができます。

次のコードでは、直角三角形の2辺の長さから角度を計算しています。

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

#define PI 3.14159265

int main() {
    double opposite = 5.0;
    double adjacent = 10.0;

    double theta = atan(opposite / adjacent) * 180 / PI;
    printf("角度: %.2f\n", theta);
    return 0;
}

このコードでは、atan関数(arctanの略)を使用しています。

atan関数は、tan関数の逆関数で、引数として対辺と隣辺の比を取り、その角度(ラジアン単位)を返します。

最後にラジアンから度に変換するために、180 / π を掛けています。

○サンプルコード7:逆三角関数を用いたベクトルの角度計算

三角関数は、ベクトルの角度計算にも利用できます。

次のコードは、2つのベクトルの間の角度を計算します。

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

#define PI 3.14159265

int main() {
    double x1 = 5.0, y1 = 10.0;
    double x2 = -3.0, y2 = 4.0;

    double dot_product = x1 * x2 + y1 * y2;
    double magnitude1 = sqrt(x1 * x1 + y1 * y1);
    double magnitude2 = sqrt(x2 * x2 + y2 * y2);

    double cos_theta = dot_product / (magnitude1 * magnitude2);
    double theta = acos(cos_theta) * 180 / PI;
    printf("角度: %.2f\n", theta);
    return 0;
}

ここでは、2つのベクトルの間の角度θを求めています。

これは、ベクトルの内積(dot_product)とベクトルの大きさ(magnitude)を用いて計算されます。

cosθは内積を二つのベクトルの大きさの積で割ったもので、この値から逆cos関数(acos)を使ってθを得ます。

そして、ラジアンから度への変換が行われます。

○サンプルコード8:三角関数を用いたアニメーション作成

次に、アニメーションの生成に三角関数をどのように使用できるかを考えてみましょう。

三角関数は波形を作成するのに最適であり、それらの波形を利用して視覚的なエフェクトを生成することが可能です。

簡単なアニメーションを生成するC言語のコードを紹介します。

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

#define PI 3.14159265

int main(void) {
    double i;
    int space;
    for(i = 0.0; i <= 4*PI ; i += 0.05) {
        space = 20 * (1 + sin(i));
        printf("\r%*s*\n", space, "");
        usleep(50000);
    }
    return 0;
}

このコードでは、sin関数を用いて波形を生成しています。

ループの各イテレーションで、sin関数にiを渡すことで一定の間隔で波形の値を生成しています。

波形の値は-1から1の範囲で変化するため、20 * (1 + sin(i))とすることで、0から40の範囲でスペースの数を生成します。

そして、printf関数でそのスペースの数だけスペースを出力した後にアスタリスクを出力します。

これにより、アスタリスクが画面上で左右に動くアニメーションが作成されます。

また、usleep関数を使ってループの各イテレーションごとに少し待つことで、アニメーションのスピードを制御しています。

このコードを実行すると、アスタリスクが画面上を左右に動くアニメーションが表示されます。

これは、sin関数によって生成された波形が時間と共にどのように変化するかを視覚的に表現したものです。

アスタリスクの位置はsin関数の値に基づいているため、sin関数の周期性がこのアニメーションに反映されます。

○サンプルコード9:三角関数を用いた音波生成

音は基本的に波形であり、特定の周波数と振幅を持つ波形が耳に到達すると、私たちはそれを音として認識します。

この性質を利用して、三角関数を使って音を生成することができます。

単純な正弦波形を生成し、その波形を音として出力するC言語のコードを紹介します。

このコードは実行すると、特定の周波数の音を出力します。

ただし、このコードは簡単化のために非常に基本的なものであり、実際の音声ファイル生成や音声出力にはより高度なライブラリやAPIを使用する必要があります。

また、生成された音を聞くためには適切な音声出力デバイスが必要です。

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

#define PI 3.14159265
#define SAMPLE_RATE 44100
#define TONE_FREQ 440.0
#define DURATION 5.0

int main(void) {
    int i, num_samples;
    double t, tone;

    num_samples = DURATION * SAMPLE_RATE;
    for(i = 0; i < num_samples; i++) {
        t = (double)i / SAMPLE_RATE;
        tone = sin(2 * PI * TONE_FREQ * t);
        // ここで音声出力処理を行います。詳細は省略します。
    }
    return 0;
}

このコードでは、サンプルレート(SAMPLE_RATE)、音の周波数(TONE_FREQ)、そして音の持続時間(DURATION)を設定しています。

サンプルレートは、一秒間に何回音の強度をサンプリングするかを表しています。

この例では、44,100Hz(CD品質)のサンプルレートを使用しています。音の周波数は、音のピッチを決定します。

この例では、440Hz(通常のA音)を使用しています。

そして、音の持続時間は、音が何秒間続くかを決定します。

この例では、5.0秒を使用しています。

このコードの主要な部分は、波形の各サンプルを生成するループです。

ループの各イテレーションで、時間tを計算し、その時間での音の強度(tone)をsin関数を使用して計算しています。

sin関数の引数は、2 * PI * TONE_FREQ * tとなっており、これにより特定の周波数の波形が生成されます。

そして、その波形の値が音の強度となります。

このコードを実行すると、440Hzの音が5秒間生成されます。

ただし、このコードでは音声出力処理が省略されていますので、実際には音は出ません。

実際の音声出力処理を実装するには、通常は専用のライブラリやAPIを使用します。

○サンプルコード10:三角関数を用いた物体の運動シミュレーション

三角関数は物理学における運動のシミュレーションにも頻繁に用いられます。

例えば、物体が円形に運動する場合、その位置を計算するためにsin関数とcos関数を使用することができます。

時間によって変化する物体のx座標とy座標を計算するC言語のコードを紹介します。

#include<stdio.h>
#include<math.h>
#define PI 3.14159265

int main(void) {
    double t;
    double radius = 10.0; // 半径
    double speed = 1.0; // 速度
    double x, y;

    for(t = 0.0; t <= 2*PI; t += 0.1) {
        x = radius * cos(t * speed);
        y = radius * sin(t * speed);
        printf("t = %.2lf: x = %.2lf, y = %.2lf\n", t, x, y);
    }
    return 0;
}

このコードでは、物体の運動半径を10.0、物体の速度を1.0と設定しています。

物体の速度は、運動が一周するのに要する時間を決定します。この例では、物体は1.0秒で一周します。

次に、時間tを0から2π(物体が一周する時間)まで0.1秒刻みで増加させています。

各時間での物体の位置(xy)は、radius * cos(t * speed)radius * sin(t * speed)を使って計算しています。

これらの計算により、時間tに対する物体のx座標とy座標が得られます。

このコードを実行すると、時間tに対する物体のx座標とy座標の値が出力されます。

これらの値は物体が円運動をしている様子を表現しています。

●注意点と対処法

C言語で三角関数を利用する際にはいくつかの注意点があります。

その一部を詳しく解説していきます。

まず、C言語の三角関数はラジアン単位で動作します。

度数法で角度を指定すると予期せぬ結果を得る可能性があるので注意が必要です。

ラジアンから度への変換、度からラジアンへの変換は次のようなコードで実現できます。

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

int main(void) {
    double deg = 45.0;
    double rad = deg * M_PI / 180.0;  // 度からラジアンへ変換

    printf("ラジアン:%lf\n", rad);

    double back_deg = rad * 180.0 / M_PI;  // ラジアンから度へ変換

    printf("度数:%lf\n", back_deg);

    return 0;
}

次に、浮動小数点数の精度についてです。

C言語の三角関数の結果は浮動小数点数で返されますが、その値は必ずしも完全に正確なものではありません。

これはコンピュータが内部的に数値を表現する際の制約からくるもので、下記のコードはその事実を明らかにします。

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

int main(void) {
    printf("%f\n", cos(M_PI));  // -1.000000となるべきですが…

    return 0;
}

このコードを実行すると、出力結果は-1.000000ではなく、ほんの少し違う数値が表示される可能性があります。

これは浮動小数点数の誤差で、このような現象を理解しておくことは重要です。

以上の注意点を理解し、対策を講じることで、より正確で安定したコードを書くことが可能になります。

●カスタマイズ方法

C言語での三角関数の使用は非常に広範で、その応用可能性は無限大です。

ここでは、一般的なカスタマイズ方法の一部を紹介します。

○サンプルコード11:sin関数を用いた複数の波形の重ね合わせ

音声データや通信データなどはしばしば複数の波形の重ね合わせで表されます。

下記のコードはsin関数を用いて二つの異なる周波数を持つ波形を生成し、それらを重ね合わせて一つの波形を作り出す例です。

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

#define PI 3.14159265358979323846
#define SIZE 360

int main(void) {
    double wave1[SIZE];
    double wave2[SIZE];
    double wave[SIZE];

    // 波形1を生成
    for (int i = 0; i < SIZE; i++) {
        wave1[i] = sin(2 * PI * i / SIZE);
    }

    // 波形2を生成
    for (int i = 0; i < SIZE; i++) {
        wave2[i] = 0.5 * sin(4 * PI * i / SIZE);
    }

    // 二つの波形を重ね合わせる
    for (int i = 0; i < SIZE; i++) {
        wave[i] = wave1[i] + wave2[i];
    }

    // 結果を出力
    for (int i = 0; i < SIZE; i++) {
        printf("%lf\n", wave[i]);
    }

    return 0;
}

このように三角関数を用いれば、多様な波形操作が可能となります。

必要に応じてコードをカスタマイズしてみてください。

まとめ

この記事では、C言語を使った三角関数の基本的な使い方から実践的な応用例、注意点、カスタマイズ方法までを幅広く紹介しました。

三角関数は、物理学やエンジニアリング、グラフィックス、音響学など、様々な場面で活用されます。

そのため、これらの基本的な知識を身につけることは、より高度なプログラミングスキルを獲得する上で非常に重要です。

いずれのサンプルコードも、皆さんが自分のプロジェクトに適用したり、自分だけのコードにカスタマイズしたりするための出発点であり、三角関数の可能性をさらに広げるための触媒となれば幸いです。

さあ、キーボードを手に取り、C言語で三角関数の世界を探索しましょう。