src/rcrt/math/Vec3D.cpp

Go to the documentation of this file.
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 }

Generated on Thu Jan 31 19:26:19 2008 for RenderingCompetitionRayTracer by  doxygen 1.5.3