Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

Vector3.cpp

00001 /*************************************************************************** 00002 * This file is part of OpenCAL: Open Computer Animation Library * 00003 * I created OpenCAL as my master's thesis Computer Science (multimedia) * 00004 * at the tUL university in Diepenbeek, Belgium * 00005 * * 00006 * Copyright (C) 2003-2004 by Jeroen Dierckx * 00007 * jeroen.dierckx@student.luc.ac.be * 00008 * * 00009 ***************************************************************************/ 00010 00011 // Includes 00012 #include "Vector3.h" 00013 #include <OpenCAL/Quaternion.h> 00014 using namespace OpenCAL::Utils; 00015 00016 #include <math.h> 00017 00018 #include <ostream> 00019 using namespace std; 00020 00021 00022 // Static members 00023 Vector3 Vector3::zero(0.0f, 0.0f, 0.0f); 00024 00025 00026 /****************************** 00027 * Constructors and destructor * 00028 ******************************/ 00029 00030 Vector3::Vector3() 00031 { 00032 m_values[0] = 0.0f; 00033 m_values[1] = 0.0f; 00034 m_values[2] = 0.0f; 00035 } 00036 00037 Vector3::Vector3(float x, float y, float z) 00038 { 00039 m_values[0] = x; 00040 m_values[1] = y; 00041 m_values[2] = z; 00042 } 00043 00044 Vector3::Vector3(float *values) 00045 { 00046 m_values[0] = values[0]; 00047 m_values[1] = values[1]; 00048 m_values[2] = values[2]; 00049 } 00050 00051 Vector3::Vector3(const Vector3 &source) 00052 { 00053 m_values[0] = source.m_values[0]; 00054 m_values[1] = source.m_values[1]; 00055 m_values[2] = source.m_values[2]; 00056 } 00057 00058 Vector3::~Vector3() 00059 { 00060 } 00061 00062 00063 /************************ 00064 * Get and set functions * 00065 ************************/ 00066 00067 void Vector3::set(float x, float y, float z) 00068 { 00069 m_values[0] = x; 00070 m_values[1] = y; 00071 m_values[2] = z; 00072 } 00073 00074 void Vector3::set(float *values) 00075 { 00076 m_values[0] = values[0]; 00077 m_values[1] = values[1]; 00078 m_values[2] = values[2]; 00079 } 00080 00081 void Vector3::add(float x, float y, float z) 00082 { 00083 m_values[0] += x; 00084 m_values[1] += y; 00085 m_values[2] += z; 00086 } 00087 00088 void Vector3::add(float *values) 00089 { 00090 m_values[0] += values[0]; 00091 m_values[1] += values[1]; 00092 m_values[2] += values[2]; 00093 } 00094 00095 00096 /********************* 00097 * Operator functions * 00098 *********************/ 00099 00100 Vector3 Vector3::operator+(const Vector3 &v) const 00101 { 00102 return Vector3( 00103 m_values[0] + v.m_values[0], 00104 m_values[1] + v.m_values[1], 00105 m_values[2] + v.m_values[2] 00106 ); 00107 } 00108 00109 Vector3 Vector3::operator-(const Vector3 &v) const 00110 { 00111 return Vector3( 00112 m_values[0] - v.m_values[0], 00113 m_values[1] - v.m_values[1], 00114 m_values[2] - v.m_values[2] 00115 ); 00116 } 00117 00118 Vector3 Vector3::operator-() const 00119 { 00120 return Vector3( 00121 -m_values[0], 00122 -m_values[1], 00123 -m_values[2] 00124 ); 00125 } 00126 00127 Vector3 Vector3::operator*(float factor) const 00128 { 00129 return Vector3( 00130 m_values[0] * factor, 00131 m_values[1] * factor, 00132 m_values[2] * factor 00133 ); 00134 } 00135 00136 Vector3 Vector3::operator/(float factor) const 00137 { 00138 return Vector3( 00139 m_values[0] / factor, 00140 m_values[1] / factor, 00141 m_values[2] / factor 00142 ); 00143 } 00144 00145 void Vector3::operator+=(const Vector3 &v) 00146 { 00147 m_values[0] += v.m_values[0]; 00148 m_values[1] += v.m_values[1]; 00149 m_values[2] += v.m_values[2]; 00150 } 00151 00152 void Vector3::operator-=(const Vector3 &v) 00153 { 00154 m_values[0] -= v.m_values[0]; 00155 m_values[1] -= v.m_values[1]; 00156 m_values[2] -= v.m_values[2]; 00157 } 00158 00159 void Vector3::operator*=(float factor) 00160 { 00161 m_values[0] *= factor; 00162 m_values[1] *= factor; 00163 m_values[2] *= factor; 00164 } 00165 00166 void Vector3::operator/=(float factor) 00167 { 00168 m_values[0] /= factor; 00169 m_values[1] /= factor; 00170 m_values[2] /= factor; 00171 } 00172 00173 bool Vector3::operator==(const Vector3 &v) 00174 { 00175 return ( 00176 m_values[0] == v.m_values[0] && 00177 m_values[1] == v.m_values[1] && 00178 m_values[2] == v.m_values[2] 00179 ); 00180 } 00181 00182 bool Vector3::operator!=(const Vector3 &v) 00183 { 00184 return ( 00185 m_values[0] != v.m_values[0] || 00186 m_values[1] != v.m_values[1] || 00187 m_values[2] != v.m_values[2] 00188 ); 00189 } 00190 00191 // Friend functions 00192 Vector3 OpenCAL::Utils::operator*(float factor, const Vector3 &v) 00193 { 00194 return Vector3( 00195 v.m_values[0] * factor, 00196 v.m_values[1] * factor, 00197 v.m_values[2] * factor 00198 ); 00199 } 00200 00201 Vector3 OpenCAL::Utils::operator/(float factor, const Vector3 &v) 00202 { 00203 return Vector3( 00204 factor / v.m_values[0], 00205 factor / v.m_values[1], 00206 factor / v.m_values[2] 00207 ); 00208 } 00209 00210 00211 /****************** 00212 * Blend functions * 00213 ******************/ 00214 00215 void Vector3::blend(float u, const Vector3 &source, const Vector3 &dest) 00216 { 00217 *this += u * (dest - source); 00218 } 00219 00220 Vector3 Vector3::blended(float u, const Vector3 &source, const Vector3 &dest) const 00221 { 00222 return source + u * (dest - source); 00223 } 00224 00225 00226 /****************** 00227 * Other functions * 00228 ******************/ 00229 00230 float Vector3::dotProduct(const Vector3 &v) const 00231 { 00232 return ( 00233 m_values[0] * v.m_values[0] + 00234 m_values[1] * v.m_values[1] + 00235 m_values[2] * v.m_values[2] 00236 ); 00237 } 00238 00239 Vector3 Vector3::crossProduct(const Vector3 &v) const 00240 { 00241 return Vector3( 00242 m_values[1] * v.m_values[2] - m_values[2] * v.m_values[1], 00243 m_values[2] * v.m_values[0] - m_values[0] * v.m_values[2], 00244 m_values[0] * v.m_values[1] - m_values[1] * v.m_values[0] 00245 ); 00246 } 00247 00248 float Vector3::squaredLength() const 00249 { 00250 return ( 00251 m_values[0] * m_values[0] + 00252 m_values[1] * m_values[1] + 00253 m_values[2] * m_values[2] 00254 ); 00255 } 00256 00257 float Vector3::length() const 00258 { 00259 return sqrtf( 00260 m_values[0] * m_values[0] + 00261 m_values[1] * m_values[1] + 00262 m_values[2] * m_values[2] 00263 ); 00264 } 00265 00266 float Vector3::distance(const Vector3 &v) const 00267 { 00268 float dx = v.m_values[0] - m_values[0]; 00269 float dy = v.m_values[1] - m_values[1]; 00270 float dz = v.m_values[2] - m_values[2]; 00271 00272 return sqrtf(dx * dx + dy * dy + dz * dz); 00273 } 00274 00275 float Vector3::squaredDistance(const Vector3 &v) const 00276 { 00277 float dx = v.m_values[0] - m_values[0]; 00278 float dy = v.m_values[1] - m_values[1]; 00279 float dz = v.m_values[2] - m_values[2]; 00280 00281 return (dx * dx + dy * dy + dz * dz); 00282 } 00283 00284 Vector3 Vector3::normalized() const 00285 { 00286 float l = length(); 00287 00288 return Vector3( 00289 m_values[0] / l, 00290 m_values[1] / l, 00291 m_values[2] / l 00292 ); 00293 } 00294 00295 void Vector3::normalize() 00296 { 00297 float l = length(); 00298 00299 m_values[0] /= l; 00300 m_values[1] /= l; 00301 m_values[2] /= l; 00302 } 00303 00304 void Vector3::rotate(const Quaternion &rot) 00305 { 00306 *this = rotated(rot); 00307 } 00308 00309 Vector3 Vector3::rotated(const Quaternion &rot) const 00310 { 00311 Quaternion v(0.0f, *this); 00312 00313 return (rot * v * rot.inversed()).getVector(); 00314 } 00315 00316 void Vector3::rotated(const Quaternion &rot, Vector3 *result) const 00317 { 00318 *result = rotated(rot); 00319 } 00320 00324 Matrix33 Vector3::star() const 00325 { 00326 return Matrix33( 00327 0, -m_values[2], m_values[1], 00328 m_values[2], 0, -m_values[0], 00329 -m_values[1], m_values[0], 0 00330 ); 00331 } 00332 00333 void Vector3::print() const 00334 { 00335 cout << m_values[0] << ", " << m_values[1] << ", " << m_values[2] << endl; 00336 } 00337 00338 ostream &OpenCAL::Utils::operator<<(ostream &stream, const Vector3 &v) 00339 { 00340 stream << "(" << v.m_values[0] << ", " << v.m_values[1] << ", " << v.m_values[2] << ")"; 00341 return stream; 00342 }

Generated on Sun Aug 15 19:19:23 2004 for OpenCAL: Open Computer Animation Library by doxygen 1.3.8