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() の呼び出しなどを追加すれば、より実用的なベクトルライブラリへと発展させることが可能です。
-
配列を使ってC++でスタックを実装する方法【サンプルコード付きで解説】
スタック(Stack)は、要素の集合を管理するための抽象データ構造の一つです。最大の特徴はLIFO(Last In, First Out:後入れ先出し)方式を採用している点で、最後に追加された要素ほど最初に取り出されます。本記事では、C++の配列を使ってスタックを実装する方法を、完全なサンプルコードとともにわかりやすく解説します。スタックの主な操作スタックに対して行える基本的な操作には、次の3つがあります。Push(プッシュ) … スタックの頂上(トップ)に新しいデータを追加するPop(ポップ) … スタックのトップからデータを取り除くPeek(ピーク) … スタックのトップにあるデータを参照
-
C++のローカルクラスとは?特徴・制約と実装例をわかりやすく解説
ローカルクラスとは C++において、関数の中で宣言されたクラスは「ローカルクラス」と呼ばれます。これは、そのクラスが定義された関数の内部でのみ有効であるためです。 まず、ローカルクラスの基本的な構造を見てみましょう。 #include<iostream> using namespace std; void func() { class LocalClass { }; } int main() { return 0; } 上記の例では、関数 func() の中で LocalClass が定義されています。このように関数の内部で宣言されたクラスが、ローカルクラス