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 }