C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でクラスを使ってベクトル量を実装する方法

このチュートリアルでは、C++においてクラスを使用してベクトル量(ベクトル)を実装する方法について詳しく解説します。

ベクトル量とは?

ベクトル量とは、大きさ(マグニチュード)方向の両方を持つ物理量のことです。速度や力などがその代表例です。

本記事では、Vectorクラスを定義してベクトルを表現し、以下のような基本演算を実装します。

  • ベクトルの加算(和)
  • ベクトルの減算(差)
  • 内積(ドット積)
  • 外積(クロス積)

実装コード

C++では演算子オーバーロードを活用することで、ベクトル同士の演算を直感的な記述で行えるようになります。

#include <cmath>
#include <iostream>
using namespace std;

class Vector {
    private:
    int x, y, z; // ベクトルの各成分

    public:
    // コンストラクタ:各成分を初期化
    Vector(int x, int y, int z){
        this->x = x;
        this->y = y;
        this->z = z;
    }

    // 演算子オーバーロードの宣言
    Vector operator+(Vector v); // 加算
    Vector operator-(Vector v); // 減算
    int operator^(Vector v);    // 内積
    Vector operator*(Vector v); // 外積

    // ベクトルの大きさを計算
    float magnitude(){
        return sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
    }

    // 出力用のfriend関数
    friend ostream& operator<<(ostream& out, const Vector& v);
};

// ベクトルの加算
Vector Vector::operator+(Vector v){
    return Vector(x + v.x, y + v.y, z + v.z);
}

// ベクトルの減算
Vector Vector::operator-(Vector v){
    return Vector(x - v.x, y - v.y, z - v.z);
}

// ベクトルの内積
int Vector::operator^(Vector v){
    return (x * v.x + y * v.y + z * v.z);
}

// ベクトルの外積
Vector Vector::operator*(Vector v){
    int x1 = y * v.z - z * v.y;
    int y1 = z * v.x - x * v.z;
    int z1 = x * v.y - y * v.x;
    return Vector(x1, y1, z1);
}

// ベクトルの出力(i, j, k形式)
ostream& operator<<(ostream& out, const Vector& v){
    out << v.x << "i ";
    if (v.y >= 0)
        out << "+ ";
    out << v.y << "j ";
    if (v.z >= 0)
        out << "+ ";
    out << v.z << "k" << endl;
    return out;
}

int main(){
    Vector V1(3, 4, 2), V2(6, 3, 9);

    cout << "V1 = " << V1;
    cout << "V2 = " << V2;
    cout << "V1 + V2 = " << (V1 + V2);
    cout << "内積 : " << (V1 ^ V2);
    cout << "外積 : " << (V1 * V2);

    return 0;
}

コードのポイント解説

1. クラスの構成

Vectorクラスは、x・y・zの3つの整数型メンバ変数をprivateで保持し、コンストラクタで初期化します。

2. 演算子オーバーロード

  • operator+ … 対応する成分同士を加算した新しいベクトルを返します。
  • operator- … 対応する成分同士を減算した新しいベクトルを返します。
  • operator^ … 内積(スカラー値)を計算して返します。計算式は x1*x2 + y1*y2 + z1*z2 です。
  • operator* … 外積(ベクトル値)を計算して返します。

3. 大きさの計算

magnitude() メソッドでは、三平方の定理を拡張した式 √(x² + y² + z²) を使ってベクトルの大きさを求めます。

4. 出力のカスタマイズ

friend関数として operator<< を定義することで、ベクトルを「3i + 4j + 2k」のような数学的な表記で出力できます。

出力結果

V1 = 3i + 4j + 2k
V2 = 6i + 3j + 9k
V1 + V2 = 9i + 7j + 11k
内積 : 48
外積 : 30i -15j -15k

まとめ

このように、C++のクラスと演算子オーバーロードを組み合わせることで、数学的なベクトル操作を自然なコードで表現できます。今回の実装をベースに、スカラー倍や正規化、magnitude() の呼び出しなどを追加すれば、より実用的なベクトルライブラリへと発展させることが可能です。

  1. 配列を使ってC++でスタックを実装する方法【サンプルコード付きで解説】

    スタック(Stack)は、要素の集合を管理するための抽象データ構造の一つです。最大の特徴はLIFO(Last In, First Out:後入れ先出し)方式を採用している点で、最後に追加された要素ほど最初に取り出されます。本記事では、C++の配列を使ってスタックを実装する方法を、完全なサンプルコードとともにわかりやすく解説します。スタックの主な操作スタックに対して行える基本的な操作には、次の3つがあります。Push(プッシュ) … スタックの頂上(トップ)に新しいデータを追加するPop(ポップ) … スタックのトップからデータを取り除くPeek(ピーク) … スタックのトップにあるデータを参照

  2. C++のローカルクラスとは?特徴・制約と実装例をわかりやすく解説

    ローカルクラスとは C++において、関数の中で宣言されたクラスは「ローカルクラス」と呼ばれます。これは、そのクラスが定義された関数の内部でのみ有効であるためです。 まず、ローカルクラスの基本的な構造を見てみましょう。 #include<iostream> using namespace std; void func() { class LocalClass { }; } int main() { return 0; } 上記の例では、関数 func() の中で LocalClass が定義されています。このように関数の内部で宣言されたクラスが、ローカルクラス