00001 #pragma once
00002
00003
00004 #include <math.h>
00005 #include "VCommon.h"
00006
00007
00008 class VVector
00009 {
00010 public:
00011 VVector()
00012 {
00013 m_vfElements[0] = 0.0f;
00014 m_vfElements[1] = 0.0f;
00015 m_vfElements[2] = 0.0f;
00016 };
00017
00018 VVector(const float fX, const float fY, const float fZ)
00019 {
00020 m_vfElements[0] = fX;
00021 m_vfElements[1] = fY;
00022 m_vfElements[2] = fZ;
00023 };
00024
00025 VVector::VVector(const float vfValues[])
00026 {
00027 m_vfElements[0] = vfValues[0];
00028 m_vfElements[1] = vfValues[1];
00029 m_vfElements[2] = vfValues[2];
00030 };
00031
00032 ~VVector()
00033 {
00034 };
00035
00036 void set(const float fX, const float fY, const float fZ)
00037 {
00038 m_vfElements[0] = fX;
00039 m_vfElements[1] = fY;
00040 m_vfElements[2] = fZ;
00041 };
00042
00043 void setX(const float fX)
00044 {
00045 m_vfElements[0] = fX;
00046 };
00047
00048 void setY(const float fY)
00049 {
00050 m_vfElements[1] = fY;
00051 };
00052
00053 void setZ(const float fZ)
00054 {
00055 m_vfElements[2] = fZ;
00056 };
00057
00058 float * getPtr()
00059 {
00060 return m_vfElements;
00061 };
00062
00063 const float get(const unsigned int uIndex) const
00064 {
00065 return m_vfElements[uIndex];
00066 };
00067
00068 const float getX() const
00069 {
00070 return m_vfElements[0];
00071 };
00072
00073 const float getY() const
00074 {
00075 return m_vfElements[1];
00076 };
00077
00078 const float getZ() const
00079 {
00080 return m_vfElements[2];
00081 };
00082
00083 const float getMagnitude() const
00084 {
00085 return sqrtf(getX()*getX() + getY()*getY() + getZ()*getZ());
00086 };
00087
00088 const float getSquaredMagnitude() const
00089 {
00090 return (getX()*getX() + getY()*getY() + getZ()*getZ());
00091 };
00092
00093 const float getDot(const VVector &vecOther) const
00094 {
00095 return (getX() * vecOther.getX() + getY()*vecOther.getY() + getZ()*vecOther.getZ());
00096 };
00097
00098 const VVector getCross(const VVector &vecOther) const
00099 {
00100 return VVector(getY()*vecOther.getZ() - getZ()*vecOther.getY(), getZ()*vecOther.getX() - getX() * vecOther.getZ(), getX()*vecOther.getY() - getY()*vecOther.getX());
00101 };
00102
00103 const VVector getNormalized() const
00104 {
00105 VVector vecNew = *this;
00106 float fMagnitude = vecNew.getMagnitude();
00107
00108 if (fMagnitude > 0.0f)
00109 vecNew /= fMagnitude;
00110
00111 return vecNew;
00112 };
00113
00114 const VVector getInverse() const
00115 {
00116 return VVector(1.0f/getX(),1.0f/getY(),1.0f/getZ());
00117 };
00118
00119 void normalize()
00120 {
00121 (*this) = getNormalized();
00122 };
00123
00124 void invert()
00125 {
00126 (*this) = getInverse();
00127 };
00128
00129 const bool operator==(const VVector & vecOther) const
00130 {
00131 return (getX() == vecOther.getX()) && (getY() == vecOther.getY()) && (getZ() == vecOther.getZ());
00132 };
00133
00134 const bool operator!=(const VVector & vecOther) const
00135 {
00136 return !(*this == vecOther);
00137 };
00138
00139 float & operator[](const unsigned int uIndex)
00140 {
00141 return m_vfElements[uIndex];
00142 };
00143
00144 const float operator[](const unsigned int uIndex) const
00145 {
00146 return m_vfElements[uIndex];
00147 };
00148
00149 const VVector & operator+=(const VVector & vecOther)
00150 {
00151 setX(getX()+vecOther.getX());
00152 setY(getY()+vecOther.getY());
00153 setZ(getZ()+vecOther.getZ());
00154 return *this;
00155 };
00156
00157 const VVector & operator-=(const VVector & vecOther)
00158 {
00159 setX(getX()-vecOther.getX());
00160 setY(getY()-vecOther.getY());
00161 setZ(getZ()-vecOther.getZ());
00162 return *this;
00163 };
00164
00165 const VVector & operator*=(const VVector & vecOther)
00166 {
00167 setX(getX()*vecOther.getX());
00168 setY(getY()*vecOther.getY());
00169 setZ(getZ()*vecOther.getZ());
00170 return *this;
00171 };
00172
00173 const VVector & operator*=(const float & fOther)
00174 {
00175 setX(getX()*fOther);
00176 setY(getY()*fOther);
00177 setZ(getZ()*fOther);
00178 return *this;
00179 };
00180
00181 const VVector & operator/=(const VVector & vecOther)
00182 {
00183 setX(getX()/vecOther.getX());
00184 setY(getY()/vecOther.getY());
00185 setZ(getZ()/vecOther.getZ());
00186 return *this;
00187 };
00188
00189 const VVector & operator/=(const float & fOther)
00190 {
00191 setX(getX()/fOther);
00192 setY(getY()/fOther);
00193 setZ(getZ()/fOther);
00194 return *this;
00195 };
00196
00197 const VVector operator+(const VVector & vecOther) const
00198 {
00199 VVector vecNew = *this;
00200 vecNew += vecOther;
00201 return vecNew;
00202 };
00203
00204 const VVector operator-(const VVector & vecOther) const
00205 {
00206 VVector vecNew = *this;
00207 vecNew -= vecOther;
00208 return vecNew;
00209 };
00210
00211 const VVector operator*(const VVector & vecOther) const
00212 {
00213 VVector vecNew = *this;
00214 vecNew *= vecOther;
00215 return vecNew;
00216 };
00217
00218 const VVector operator*(const float & fOther) const
00219 {
00220 VVector vecNew = *this;
00221 vecNew *= fOther;
00222 return vecNew;
00223 };
00224
00225 const VVector operator/(const VVector & vecOther) const
00226 {
00227 VVector vecNew = *this;
00228 vecNew /= vecOther;
00229 return vecNew;
00230 };
00231
00232 const VVector operator/(const float & fOther) const
00233 {
00234 VVector vecNew = *this;
00235 vecNew /= fOther;
00236 return vecNew;
00237 };
00238
00239 const VVector operator-() const
00240 {
00241 return VVector(-getX(),-getY(),-getZ());
00242 };
00243
00244 private:
00245 float m_vfElements[3];
00246 };
00247
00248 inline std::ostream & operator<< (std::ostream & os, const VVector & vecVector)
00249 {
00250 os << "(" << vecVector.getX() << ";" << vecVector.getY() << ";" << vecVector.getZ() << ")";
00251 return os;
00252 }
00253
00254 inline std::istream & operator>> (std::istream & is, VVector & vecVector)
00255 {
00256
00257 float fX,fY,fZ;
00258 if (is >> eat("(") >> fX >> eat(";") >> fY >> eat(";") >> fZ >> eat(")"))
00259 vecVector.set(fX,fY,fZ);
00260
00261 return is;
00262 }