00001 #include <cmath> 00002 #include "Vec3D.h" 00003 00004 namespace rcrt 00005 { 00006 00007 00008 Vec3D::Vec3D() 00009 { 00010 values[0] = values[1] = values[2] = 0; 00011 } 00012 00013 Vec3D::Vec3D(const float& val) 00014 { 00015 values[0] = values[1] = values[2] = val; 00016 } 00017 00018 Vec3D::Vec3D(const float& xc, const float& yc, const float& zc) 00019 { 00020 values[0] = xc; 00021 values[1] = yc; 00022 values[2] = zc; 00023 } 00024 00025 00026 Vec3D::Vec3D(const Vec3D& vec) 00027 { 00028 assign(vec); 00029 } 00030 00031 00032 Vec3D::~Vec3D() 00033 { 00034 } 00035 00036 00037 void Vec3D::assign(const Vec3D& vec) 00038 { 00039 if(&vec != this){ 00040 values[0] = vec.values[0]; 00041 values[1] = vec.values[1]; 00042 values[2] = vec.values[2]; 00043 } 00044 } 00045 00046 00047 00048 const Vec3D& Vec3D::operator= (const Vec3D& vec) 00049 { 00050 assign(vec); 00051 00052 return *this; 00053 } 00054 00055 00056 Vec3D Vec3D::operator+ (const Vec3D& vec) const 00057 { 00058 return Vec3D(values[0]+vec.values[0], 00059 values[1]+vec.values[1], 00060 values[2]+vec.values[2]); 00061 } 00062 00063 00064 Vec3D Vec3D::operator- (const Vec3D& vec) const 00065 { 00066 return Vec3D(values[0]-vec.values[0], 00067 values[1]-vec.values[1], 00068 values[2]-vec.values[2]); 00069 } 00070 00071 00072 float Vec3D::operator* (const Vec3D& vec) const 00073 { 00074 return values[0]*vec.values[0]+ 00075 values[1]*vec.values[1]+ 00076 values[2]*vec.values[2]; 00077 } 00078 00079 float Vec3D::operator[] (int i) const 00080 { 00081 return values[i]; 00082 } 00083 00084 float& Vec3D::operator[] (int i) 00085 { 00086 return values[i]; 00087 } 00088 00089 00090 Vec3D Vec3D::operator* (const float& f) const 00091 { 00092 return Vec3D(values[0]*f,values[1]*f,values[2]*f); 00093 } 00094 00095 00096 Vec3D Vec3D::operator/ (const float& f) const 00097 { 00098 float g = 1/f; 00099 return Vec3D(values[0]*g,values[1]*g,values[2]*g); 00100 } 00101 00102 bool Vec3D::operator!= (const Vec3D& v) const 00103 { 00104 return values[0] != v.values[0] || values[1] != v.values[1] 00105 || values[2] != v.values[2]; 00106 } 00107 00108 bool Vec3D::operator== (const Vec3D& v) const 00109 { 00110 return values[0] == v.values[0] && values[1] == v.values[1] 00111 && values[2] == v.values[2]; 00112 } 00113 00114 00115 Vec3D Vec3D::crossP(const Vec3D& vec) const 00116 { 00117 return Vec3D(values[1]*vec.values[2] - values[2] * vec.values[1], 00118 values[2]*vec.values[0] - values[0]*vec.values[2], 00119 values[0]*vec.values[1] - values[1]*vec.values[0]); 00120 } 00121 00122 00123 Vec3D Vec3D::abs() const 00124 { 00125 return Vec3D(fabs(values[0]),fabs(values[1]),fabs(values[2])); 00126 } 00127 00128 00129 const Vec3D& Vec3D::normalize() 00130 { 00131 float n = 1/norm(); 00132 values[0] *= n; 00133 values[1] *= n; 00134 values[2] *= n; 00135 00136 return *this; 00137 } 00138 00139 00140 Vec3D Vec3D::normalized() const 00141 { 00142 return *this/norm(); 00143 } 00144 00145 00146 float Vec3D::norm() const 00147 { 00148 return sqrt(values[0]*values[0]+values[1]*values[1]+values[2]*values[2]); 00149 } 00150 00151 Vec3D Vec3D::reflect(const Vec3D& normal) const 00152 { 00153 return *this - 2*(normal* (*this))*normal; 00154 } 00155 00156 void Vec3D::getCS(Vec3D& u, Vec3D& v) const 00157 { 00158 if ((values[0] == 0) && (values[1] == 0)) { 00159 if (values[2] < 0){ 00160 u.values[0] = -1; 00161 u.values[1] = 0; 00162 u.values[2] = 0; 00163 } else { 00164 u.values[0] = 1; 00165 u.values[1] = 0; 00166 u.values[2] = 0; 00167 } 00168 v.values[0] = 0; 00169 v.values[1] = 1; 00170 v.values[2] = 0; 00171 } else { 00172 const float d = 1.0/sqrt(values[1]*values[1] + values[0]*values[0]); 00173 u.values[0] = values[1]*d; 00174 u.values[1] = -values[0]*d; 00175 u.values[2] = 0; 00176 v = this->crossP(u).normalized(); 00177 } 00178 } 00179 00180 const float& Vec3D::x() const 00181 { 00182 return values[0]; 00183 } 00184 00185 00186 const float& Vec3D::y() const 00187 { 00188 return values[1]; 00189 } 00190 00191 00192 const float& Vec3D::z() const 00193 { 00194 return values[2]; 00195 } 00196 00197 }