00001 00005 #ifndef Vector_h 00006 #define Vector_h 00007 00008 00009 #include "Math.h" 00010 #include <iosfwd> 00011 #include <math.h> 00012 00013 class Point; 00014 class Vector { 00015 public: 00016 Vector() { 00017 } 00018 Vector(double x, double y, double z) { 00019 data[0] = x; data[1] = y; data[2] = z; 00020 } 00021 inline explicit Vector(const Point& copy); 00022 00023 Vector(const Vector& copy) { 00024 for(int i=0;i<3;i++) 00025 data[i] = copy.data[i]; 00026 } 00027 00028 Vector& operator=(const Vector& copy) { 00029 for(int i=0;i<3;i++) 00030 data[i] = copy.data[i]; 00031 return *this; 00032 } 00033 00034 ~Vector() { 00035 } 00036 00037 double x() const { 00038 return data[0]; 00039 } 00040 double y() const { 00041 return data[1]; 00042 } 00043 double z() const { 00044 return data[2]; 00045 } 00046 00047 Vector operator+(const Vector& v) const { 00048 return Vector(data[0]+v.data[0], data[1]+v.data[1], data[2]+v.data[2]); 00049 } 00050 Vector operator-(const Vector& v) const { 00051 return Vector(data[0]-v.data[0], data[1]-v.data[1], data[2]-v.data[2]); 00052 } 00053 Vector operator-() const { 00054 return Vector(-data[0], -data[1], -data[2]); 00055 } 00056 Vector& operator+=(const Vector& v) { 00057 data[0]+=v.data[0]; data[1]+=v.data[1]; data[2]+=v.data[2]; 00058 return *this; 00059 } 00060 Vector& operator-=(const Vector& v) { 00061 data[0]-=v.data[0]; data[1]-=v.data[1]; data[2]-=v.data[2]; 00062 return *this; 00063 } 00064 00065 Vector operator*(const Vector& v) const { 00066 return Vector(data[0]*v.data[0], data[1]*v.data[1], data[2]*v.data[2]); 00067 } 00068 Vector operator*(double s) const { 00069 return Vector(data[0]*s, data[1]*s, data[2]*s); 00070 } 00071 Vector& operator*=(const Vector& v) { 00072 data[0]*=v.data[0]; data[1]*=v.data[1]; data[2]*=v.data[2]; 00073 return *this; 00074 } 00075 Vector& operator*=(double s) { 00076 data[0]*=s; data[1]*=s; data[2]*=s; 00077 return *this; 00078 } 00079 Vector operator/(double s) const { 00080 double inv_s = 1./s; 00081 return Vector(data[0]*inv_s, data[1]*inv_s, data[2]*inv_s); 00082 } 00083 Vector& operator/=(double s) { 00084 double inv_s = 1./s; 00085 data[0]*=inv_s; data[1]*=inv_s; data[2]*=inv_s; 00086 return *this; 00087 } 00088 Vector operator/(const Vector& v) const { 00089 return Vector(data[0]/v.data[0], data[1]/v.data[1], data[2]/v.data[2]); 00090 } 00091 00092 double length() const { 00093 return sqrt(data[0]*data[0]+data[1]*data[1]+data[2]*data[2]); 00094 } 00095 double length2() const { 00096 return data[0]*data[0]+data[1]*data[1]+data[2]*data[2]; 00097 } 00098 00099 double normalize() { 00100 double len = length(); 00101 double scale = 1.0/len; 00102 *this *= scale; 00103 return len; 00104 } 00105 double minComponent() const { 00106 return Min(data[0], data[1], data[2]); 00107 } 00108 double maxComponent() const { 00109 return Max(data[0], data[1], data[2]); 00110 } 00111 00112 Vector inverse() const { 00113 return Vector(1./data[0], 1./data[1], 1./data[2]); 00114 } 00115 Vector absoluteValue() const { 00116 return Vector(Abs(data[0]), Abs(data[1]), Abs(data[2])); 00117 } 00118 00119 static Vector zero() { 00120 return Vector(0,0,0); 00121 } 00122 static Vector one() { 00123 return Vector(1,1,1); 00124 } 00125 00126 private: 00127 double data[3]; 00128 }; 00129 00130 #include "Point.h" 00131 00132 inline Vector::Vector(const Point& copy) 00133 { 00134 data[0] = copy.x(); data[1] = copy.y(); data[2] = copy.z(); 00135 } 00136 00137 inline Vector operator*(double s, const Vector& v) { 00138 return Vector(s*v.x(), s*v.y(), s*v.z()); 00139 } 00140 00141 inline double Dot(const Vector& v1, const Vector& v2) 00142 { 00143 return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z(); 00144 } 00145 00146 inline Vector Cross(const Vector& v1, const Vector& v2) 00147 { 00148 return Vector(v1.y()*v2.z() - v1.z()*v2.y(), 00149 v1.z()*v2.x() - v1.x()*v2.z(), 00150 v1.x()*v2.y() - v1.y()*v2.x()); 00151 } 00152 00153 inline Vector Min(const Vector& p1, const Vector& p2) 00154 { 00155 return Vector(Min(p1.x(), p2.x()), Min(p1.y(), p2.y()), Min(p1.z(), p2.z())); 00156 } 00157 00158 inline Vector Max(const Vector& p1, const Vector& p2) 00159 { 00160 return Vector(Max(p1.x(), p2.x()), Max(p1.y(), p2.y()), Max(p1.z(), p2.z())); 00161 } 00162 00163 std::ostream& operator<<(std::ostream&, const Vector& v); 00164 00165 #endif