00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
00023 Vector3 Vector3::zero(0.0f, 0.0f, 0.0f);
00024
00025
00026
00027
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
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
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
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
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
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 }