00001
00008 #ifndef VECTOR3_H
00009 #define VECTOR3_H
00010
00011 #include <cmath>
00012
00019 template<class T>
00020 class Vector3
00021 {
00022 public:
00023 T x, y, z;
00024
00025 Vector3() : x((T)0), y((T)0), z((T)0) {}
00026 Vector3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}
00027
00028 void Set(T _x, T _y, T _z) { x = _x; y = _y; z = _z; }
00029
00030 T Dot(const Vector3 &v) const
00031 {
00032 return x*v.x + y*v.y + z*v.z;
00033 }
00034
00035 T Length() const
00036 {
00037 return std::sqrt( x*x + y*y + z*z );
00038 }
00039
00040 T SquaredLength() const
00041 {
00042 return x*x + y*y + z*z;
00043 }
00044
00045
00046 T Angle(const Vector3 &v) const
00047 {
00048 T denom = Length() * v.Length();
00049 if( denom == (T)0 )
00050 return (T)0;
00051
00052 return std::acos( Dot(v) / denom );
00053 }
00054
00055 void Normalize()
00056 {
00057 T len = Length();
00058 x = x / len;
00059 y = y / len;
00060 z = z / len;
00061 }
00062
00063
00064 const Vector3 Reflect(const Vector3 &n) const
00065 {
00066
00067
00068
00069
00070
00071
00072
00073
00074 Vector3 v1 = *this;
00075
00076 return v1 - 2 * n * Dot(n);
00077 }
00078
00079 Vector3 Project(const Vector3 &L) const
00080 {
00081 return L * Dot(L);
00082 }
00083
00084 Vector3 Cross(const Vector3 &v) const\
00085 {
00086 return Vector3(y*v.z - z*v.y,
00087 z*v.x - x*v.z,
00088 x*v.y - y*v.x);
00089 }
00090
00091 const Vector3 operator+(const Vector3 &v) const
00092 {
00093 return Vector3(x + v.x, y + v.y, z + v.z);
00094 }
00095
00096 const Vector3 operator-(const Vector3 &v) const
00097 {
00098 return Vector3(x - v.x, y - v.y, z - v.z);
00099 }
00100
00101 Vector3 operator-() const
00102 {
00103 return Vector3(-x, -y, -z);
00104 }
00105
00106 const Vector3 operator*(T c) const
00107 {
00108 return Vector3(x*c, y*c, z*c);
00109 }
00110
00111 const Vector3 operator/(T c) const
00112 {
00113 return Vector3(x/c, y/c, z/c);
00114 }
00115
00116 T& operator[](int i)
00117 {
00118 return ((T*)this)[i];
00119 }
00120
00121 T operator[](int i) const
00122 {
00123 return ((T*)this)[i];
00124 }
00125
00126 bool operator==(const Vector3 &v) const
00127 {
00128 return (x == v.x) && (y == v.y) && (z == v.z);
00129 }
00130
00131 friend const Vector3 operator*(T c, const Vector3 &v)
00132 {
00133 return Vector3(v.x*c, v.y*c, v.z*c);
00134 }
00135 };
00136
00137 template<class T>
00138 Vector3<T> Normalize(const Vector3<T> &v)
00139 {
00140 T len = v.Length();
00141 return Vector3<T>(v.x / len, v.y / len, v.z / len);
00142 }
00143
00144 template<class T>
00145 T Dot(const Vector3<T> &v1, const Vector3<T> &v2)
00146 {
00147 return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
00148 }
00149
00150 template<class T>
00151 Vector3<T> Cross(const Vector3<T> &v1, const Vector3<T> &v2)
00152 {
00153 return Vector3<T>(v1.y*v2.z - v1.z*v2.y,
00154 v1.z*v2.x - v1.x*v2.z,
00155 v1.x*v2.y - v1.y*v2.x);
00156 }
00157
00158 typedef Vector3<float> Vector3f;
00159 typedef Vector3<double> Vector3d;
00160
00161 #endif