#ifndef __VECTOR2_H_INCLUDE #define __VECTOR2_H_INCLUDE #include #include //---- 2次元ベクトルクラスの宣言 class TmpVec2 { public: double x, y, z; TmpVec2( void ); TmpVec2( const double& _x, const double& _y ); }; class Vector2 { public: double x, y; Vector2( void ); Vector2( const double& _x, const double& _y ); Vector2( const TmpVec2& t ); Vector2& operator = ( const Vector2& ); Vector2& operator = ( const TmpVec2& ); Vector2& operator+=( const Vector2& ); Vector2& operator+=( const TmpVec2& ); Vector2& operator-=( const Vector2& ); Vector2& operator-=( const TmpVec2& ); Vector2& operator*=( const double& ); Vector2& operator/=( const double& ); Vector2& turn( const double& angle ); }; //---- 2次元ベクトルクラスのメンバ関数 //---- コンストラクタ1 inline TmpVec2::TmpVec2( void ){} inline Vector2::Vector2( void ){} //---- コンストラクタ2 inline TmpVec2::TmpVec2( const double& _x, const double& _y ) { x = _x; y = _y; } inline Vector2::Vector2( const double& _x, const double& _y ) { x = _x; y = _y; } inline Vector2::Vector2( const TmpVec2& t ) { x = t.x; y = t.y; } //---- 代入の定義 inline Vector2& Vector2::operator = ( const Vector2& v ) { x = v.x; y = v.y; return *this; } inline Vector2& Vector2::operator = ( const TmpVec2& t ) { x = t.x; y = t.y; return *this; } //---- 単項演算子の定義 inline TmpVec2 operator - ( const Vector2& v ) { return TmpVec2( -v.x, -v.y ); } inline TmpVec2& operator - ( TmpVec2& t ) { t.x *= -1; t.y *= -1; return t; } inline Vector2& operator + ( Vector2& v ) { return( v ); } inline TmpVec2& operator + ( TmpVec2& t ) { return t; } //---- 2次元ベクトル += 2次元ベクトルの定義 inline Vector2& Vector2::operator+=( const Vector2& v ) { x += v.x; y += v.y; return *this; } inline Vector2& Vector2::operator+=( const TmpVec2& t ) { x += t.x; y += t.y; return *this; } //---- 2次元ベクトル -= 2次元ベクトルの定義 inline Vector2& Vector2::operator-=( const Vector2& v ) { x -= v.x; y -= v.y; return *this; } inline Vector2& Vector2::operator-=( const TmpVec2& t ) { x -= t.x; y -= t.y; return *this; } //---- 2次元ベクトル *= 実スカラーの定義 inline Vector2& Vector2::operator*=( const double& k ) { x *= k; y *= k; return *this; } //---- 2次元ベクトル /= 実スカラーの定義 inline Vector2& Vector2::operator/=( const double& k ) { const double inv_k = 1.0/k; x *= inv_k; y *= inv_k; return *this; } //---- 2次元ベクトル + 2次元ベクトルの定義 inline TmpVec2 operator+( const Vector2& v1, const Vector2& v2 ) { return TmpVec2( v1.x+v2.x, v1.y+v2.y ); } inline TmpVec2& operator+( TmpVec2& t, const Vector2& v ) { t.x += v.x; t.y += v.y; return t; } inline TmpVec2& operator+( const Vector2& v, TmpVec2& t ) { t.x += v.x; t.y += v.y; return t; } inline TmpVec2& operator+( TmpVec2& t1, const TmpVec2& t2 ) { t1.x += t2.x; t1.y += t2.y; return t1; } //---- 2次元ベクトル - 2次元ベクトルの定義 inline TmpVec2 operator-( const Vector2& v1, const Vector2& v2 ) { return TmpVec2( v1.x-v2.x, v1.y-v2.y ); } inline TmpVec2& operator-( TmpVec2& t, const Vector2& v ) { t.x -= v.x; t.y -= v.y; return t; } inline TmpVec2& operator-( const Vector2& v, TmpVec2& t ) { t.x *= -1; t.y *= -1; t.x += v.x; t.y += v.y; return t; } inline TmpVec2& operator-( TmpVec2& t1, const TmpVec2& t2 ) { t1.x += t2.x; t1.y += t2.y; return t1; } //---- 実スカラー * 2次元ベクトルの定義 inline TmpVec2 operator*( const double& k, const Vector2& v ) { return TmpVec2( k*v.x, k*v.y ); } inline TmpVec2& operator*( const double& k, TmpVec2& t ) { t.x *= k; t.y *= k; return t; } //---- 2次元ベクトル * 実スカラーの定義 inline TmpVec2 operator*( const Vector2& v, const double& k ) { return TmpVec2( v.x*k, v.y*k ); } inline TmpVec2& operator*( TmpVec2& t, const double& k ) { t.x *= k; t.y *= k; return t; } //---- 2次元ベクトル / 実スカラーの定義 inline TmpVec2 operator/( const Vector2& v, const double& k ) { const double inv_k = 1.0/k; return TmpVec2( v.x*inv_k, v.y*inv_k ); } inline TmpVec2& operator/( TmpVec2& t, const double& k ) { const double inv_k = 1.0/k; t.x *= inv_k; t.y *= inv_k; return t; } //---- 内積の定義 inline double operator*( const Vector2& v1, const Vector2& v2 ) { return v1.x*v2.x + v1.y*v2.y; } inline double operator*( TmpVec2& t, const Vector2& v ) { return t.x*v.x + t.y*v.y; } inline double operator*( const Vector2& v, TmpVec2& t ) { return v.x*t.x + v.y*t.y; } inline double operator*( TmpVec2& t1, const TmpVec2& t2 ) { return t1.x*t2.x + t1.y*t2.y; } //---- 外積の定義( Vector2 % Vector2 でz成分を返す ) inline double operator%( const Vector2& v1, const Vector2& v2 ) { return v1.x*v2.y - v1.y*v2.x; } //---- 外積の定義( Vector2 % z軸に平行なベクトルの大きさ ) inline TmpVec2 operator%( const Vector2& v1, const double& k ) { return TmpVec2( v1.y*k, - v1.x*k ); } //---- ベクトルの回転 inline Vector2& Vector2::turn( const double& angle ) { double c=cos(angle), s=sin(angle); double t; t = c*x - s*y; y = s*x + c*y; x = t; return *this; } //---- 絶対値の定義 inline double abs( const Vector2& v ) { return sqrt( v.x*v.x + v.y*v.y ); } //---- 絶対値の2乗の定義 inline double norm( const Vector2& v ) { return v.x*v.x + v.y*v.y; } //---- 2次元ベクトルの成分の表示 inline void print( const Vector2& v ) { printf("(%f %f)\n", v.x, v.y ); } #endif // __VECTOR2_H_INCLUDE