ベクトルクラス
ゲーム3D数学本を参考にベクトルクラスの作成。
とりあえず2Dプログラム用なのでVector2とした。
#include <math.h> namespace ddp { class Vector2 { public: // 点。隠蔽する必要性が無いのでpublicで提供 float x; float y; // コンストラクタ。明示的な初期化は行わない Vector2 () {} // コピーコンストラクタ Vector2 (const Vector2 &v) { x = v.x; y = v.y; } // 値を用いての初期化 Vector2 (float x,float y) { this->x = x; this->y = y; } // 比較 bool operator==(const Vector2 &v) const { return (x==v.x && y==v.y); } bool operator!=(const Vector2 &v) const { return (x!=v.x || y==v.y); } // スカラーの乗算 Vector2 operator*(float s) const { return Vector2(x*s,y*s); } Vector2& operator*=(float s) { x *= s; y *= s; return *this; } // スカラーの除算 Vector2 operator/(float s) const { return Vector2(x/s,y/s); } Vector2& operator/=(float s) { x /= s; y /= s; return *this; } // ベクトルの加算 Vector2 operator+(const Vector2 &v) const { return Vector2(x+v.x,y+v.y); } Vector2& operator+=(const Vector2 &v) { x += v.x; y += v.y; return *this; } // ベクトルの減算 Vector2 operator-(const Vector2 &v) const { return Vector2(x-v.x,y-v.y); } Vector2& operator-=(const Vector2 &v) { x -= v.x; y -= v.y; return *this; } // ベクトルの反転 Vector2 operator-() const { return Vector2(-x,-y); } // ベクトルの内積 float operator*(const Vector2 &v) const { return x*v.x + y*v.y; } // ベクトルの大きさ float magnitude () const { return sqrt(x*x+y*y); } // ゼロベクトルへの初期化 Vector2& zero () { x = y = 0.0f; return *this; } // ベクトルの正規化 Vector2& normalize () { float mag = magnitude(); if ( mag > 0.0f ) { x /= mag; y /= mag; } return *this; } }; // 2つの点の距離を計算する inline float distance (const Vector2 &a, const Vector2 &b) { // 距離(ベクトルの大きさ)なのでどちらから引いても同じ float x = a.x - b.x; float y = a.y - b.y; return sqrt(x*x + y*y); // 上の処理をオブジェクティブに書くならこうなる // return (a - b).magnitude(); } // 左からスカラーによる除算を可能にするためグローバルな演算子のオーバーロード inline Vector2 operator*(float s,const Vector2 &v) { return Vector2(v.x*s,v.y*s); } // グローバルなゼロベクトル変数を用意しておく extern const Vector2 g_zeroVector2; };
ちなみに3D用のVectorはこれにz軸が増えるだけで処理としては殆ど変わらないです。