C言語を駆使して図形を回転させる7つのステップ!

C言語を使って図形を回転させる方法を説明するイラストC言語
この記事は約10分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

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

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

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

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

C言語を駆使して図形を回転させるための、7つの具体的なステップをご紹介します。

ここでは初心者でも取り組みやすいよう、わかりやすい説明と具体的なサンプルコードを交えて解説を進めていきます。

●C言語とは

C言語は、1972年にベル研究所のデニス・リッチーによって開発されたプログラミング言語です。

その特性からシステムやハードウェアの開発によく使われ、またその後の多くの言語の基盤ともなりました。

○C言語の特徴

C言語にはいくつかの特徴があります。

一つ目は、記述性と効率性を両立している点です。簡潔な文法で効率的なコードを書くことができます。

二つ目は、ポータビリティが高い点です。C言語は多くのハードウェアやOSで動作することが可能です。

これらの特性から、現在でも広く利用されています。

●図形とは

図形とは、点、線、面などからなる幾何学的なオブジェクトのことを指します。

図形は様々な形状や大きさを持ち、これらを組み合わせることで様々な表現が可能となります。

○図形を表現する基本的な方法

図形の基本的な表現方法は、座標平面を用いることです。

2次元空間における座標平面では、X軸とY軸の二つの軸を基準に点をプロットします。

これにより、一定の規則に従って点をプロットすることで、線や面といった図形を形成することができます。

●図形の回転とは

図形の回転とは、ある点を中心に図形を一定の角度だけ動かすことを指します。

回転の中心となる点を選び、そこからの角度と距離を保ったまま図形を移動させることで、図形の回転を実現します。

●C言語を使って図形を回転させる方法

C言語を用いて図形を回転させるためには、座標変換の知識が必要です。

座標変換により、回転前後の座標の関係性を数式で表すことが可能となります。

○基本的な概念

図形を回転させるための基本的な概念としては、「回転行列」があります。回転行列は、元の座標を新たな座標に変換するための行列です。

2次元空間における回転行列は次のように表現されます。

cosθ -sinθ
sinθ cosθ

ここで、θは回転させる角度をラジアンで表したものです。

この行列に元の座標を掛けることで、回転後の座標を計算することができます。

○C言語での実装方法

C言語でこの回転行列を用いて図形を回転させる実装方法を説明します。

まずは基本的な点を回転させる例から見ていきましょう。

下記のサンプルコードは、原点を中心に点P(x, y)を角度θだけ回転させるコードを表しています。

この例では、math.hヘッダファイルを用いて三角関数を計算し、座標を更新しています。

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

int main(void) {
    double x = 1.0; // 点Pのx座標
    double y = 0.0; // 点Pのy座標
    double theta = M_PI / 4; // 回転させる角度(45度)

    // 回転後の座標を計算
    double new_x = cos(theta) * x - sin(theta) * y;
    double new_y = sin(theta) * x + cos(theta) * y;

    printf("新しい座標:(%f, %f)\n", new_x, new_y);

    return 0;
}

このコードを実行すると、「新しい座標:(0.707107, 0.707107)」と表示されます。

これは、原点を中心に点(1, 0)を45度回転させた結果となります。

次に、より複雑な図形、例えば矩形を回転させる例を見てみましょう。

下記のサンプルコードは、原点を中心に矩形を回転させるコードを表しています。

この例では、矩形の4つの頂点をそれぞれ回転させ、結果を表示しています。

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

// 点を表す構造体
typedef struct {
    double x;
    double y;
} Point;

// 点を回転させる関数
void rotate(Point* p, double theta) {
    double x = p->x;
    double y = p->y;
    p->x = cos(theta) * x - sin(theta) * y;
    p->y = sin(theta) * x + cos(theta) * y;
}

int main(void) {
    Point rect[4] = {
        {0.0, 0.0},
        {1.0, 0.0},
        {1.0, 1.0},
        {0.0, 1.0}
    }; // 矩形の頂点
    double theta = M_PI / 4; // 回転させる角度(45度)

    // 頂点をそれぞれ回転
    for (int i = 0; i < 4; i++) {
        rotate(&rect[i], theta);
        printf("頂点%d:(%f, %f)\n", i, rect[i].x, rect[i].y);
    }

    return 0;
}

このコードを実行すると、矩形の4つの頂点がそれぞれ新たな座標に移動したことを確認できます。

上記のような基本的な2次元の回転から一歩進んで、3次元空間での図形回転について考えてみましょう。

C言語で3Dの回転体を作る際の応用例を一つ紹介します。

●応用例:C言語で作る3D回転体

3次元空間では、図形をX軸、Y軸、Z軸のどれかを中心に回転させることが可能です。

ここでは、Z軸を中心に回転させる例を見てみましょう。

下記のサンプルコードでは、Z軸を中心に3次元座標を回転させる操作を表しています。

ここでは、3次元座標を表すための構造体と、その座標を回転させる関数を定義しています。

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

// 3次元座標を表す構造体
typedef struct {
    double x;
    double y;
    double z;
} Point3D;

// Z軸を中心に点を回転させる関数
void rotateZ(Point3D* p, double theta) {
    double x = p->x;
    double y = p->y;
    p->x = cos(theta) * x - sin(theta) * y;
    p->y = sin(theta) * x + cos(theta) * y;
}

int main(void) {
    Point3D p = {1.0, 0.0, 0.0}; // 回転させる点
    double theta = M_PI / 4; // 回転させる角度(45度)

    // 点を回転
    rotateZ(&p, theta);
    printf("新しい座標:(%f, %f, %f)\n", p.x, p.y, p.z);

    return 0;
}

このコードを実行すると、「新しい座標:(0.707107, 0.707107, 0.000000)」と表示されます。

これは、Z軸を中心に点(1, 0, 0)を45度回転させた結果となります。

こうした3Dの回転操作は、3Dゲームや物理シミュレーションなどでよく用いられます。

さらなる応用としては、図形のスケーリングやシアリング(傾斜)など、様々な座標変換が可能です。

以上がC言語を用いて図形を回転させる基本的な方法となります。

初めて触れる方でも、上記の説明とサンプルコードを元に理解を深めることができるはずです。

また、これらの基本的な操作をマスターすることで、より複雑な図形操作や3Dグラフィックスなどへの応用も可能となります。

●注意点と対処法

図形の回転を扱う際にはいくつかの注意点があります。

一つ目は、計算誤差による問題です。

C言語における浮動小数点数は誤差を含むため、繰り返し計算を行うと誤差が蓄積します。

これを防ぐためには、誤差の範囲を許容する、あるいは固定小数点数を用いるなどの対策があります。

○C言語における回転のトラブルシューティング

下記のコードは、浮動小数点数による誤差の例を示しています。

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

int main(void) {
    double theta = M_PI / 4; // 回転させる角度(45度)
    double sin_theta = sin(theta);

    // sin(theta)を8回足す
    double sum = 0.0;
    for (int i = 0; i < 8; i++) {
        sum += sin_theta;
    }

    // 結果を表示
    printf("%f\n", sum); // 5.656854

    return 0;
}

本来、sin(45度)を8回足すと6になるはずですが、上記のコードを実行すると「5.656854」と表示されます。

これは、浮動小数点数の誤差が蓄積された結果です。

また、二つ目の注意点として、回転中心の選択が挙げられます。

図形を回転させる際には、どの点を中心に回転させるかによって結果が大きく異なります。

例えば、図形の中心を回転中心に選ぶと、図形はその場で回転しますが、図形の端を回転中心に選ぶと、図形はその点を軸に回転します。

以上のように、図形の回転には複数の注意点が存在しますが、これらの理解を深めることで、より高度な図形操作が可能となります。

●カスタマイズの方法

C言語を用いた図形の回転は、さまざまなカスタマイズが可能です。

例えば、回転の中心を動的に変更したり、複数の軸を同時に回転させたりすることで、様々な表現が可能となります。

ここでは、回転角度を時間に応じて変化させる例を紹介します。

○図形の回転をカスタマイズする方法

下記のサンプルコードでは、時間経過による回転角度の変化を表現しています。

時間tが進むにつれて回転角度が増加し、図形が動的に回転します。

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

typedef struct {
    double x;
    double y;
} Point;

void rotate(Point* p, double theta) {
    double x = p->x;
    double y = p->y;
    p->x = cos(theta) * x - sin(theta) * y;
    p->y = sin(theta) * x + cos(theta) * y;
}

int main(void) {
    Point p = {1.0, 0.0}; // 回転させる点

    for (int t = 0; t < 10; t++) {
        double theta = M_PI / 4 * t; // 時間に応じて回転させる角度を増加
        rotate(&p, theta);
        printf("t=%d, 座標:(%f, %f)\n", t, p.x, p.y);
    }

    return 0;
}

このコードを実行すると、「t=0, 座標:(1.000000, 0.000000)」から始まり、「t=9, 座標:(-0.500000, 0.866025)」まで、時間tに応じて点の座標が変化する様子を確認できます。

このように、回転の中心や角度、回転のタイミングなどを自由に設定することで、様々な回転表現を実現することができます。

また、これらの基本的な手法を組み合わせることで、より複雑な動作を作り出すことも可能です。

まとめ

以上、C言語を使って図形を回転させる方法について解説しました。

ここでは、図形を回転させる基本的な概念から、具体的な実装方法、さらには応用例や注意点までを網羅的に説明しました。

C言語で図形の回転を行う際には、座標の回転という基本的な数学的概念を理解することが重要です。

その上で、具体的な実装に移ることで、理論を実際のコードに落とし込むことができます。

また、応用例として3D回転体の実装や、カスタマイズの方法についても触れました。

これらを通じて、図形の回転が実際のプログラミングでどのように活用できるかを理解していただけたかと思います。

この記事が、C言語を使った図形の回転操作について学ぶ上での一助となれば幸いです。