ベクトルクラス

ゲーム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軸が増えるだけで処理としては殆ど変わらないです。