// Wild Magic Source Code // David Eberly // http://www.geometrictools.com // Copyright (c) 1998-2008 // // This library is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or (at // your option) any later version. The license is available for reading at // either of the locations: // http://www.gnu.org/copyleft/lgpl.html // http://www.geometrictools.com/License/WildMagicLicense.pdf // // Version: 4.0.3 (2007/03/07) #ifndef WM4VECTOR3_H #define WM4VECTOR3_H #include "Wm4FoundationLIB.h" #include "Wm4Math.h" namespace Wm4 { template class Vector3 { public: // construction Vector3 (); // uninitialized Vector3 (Real fX, Real fY, Real fZ); Vector3 (const Real* afTuple); Vector3 (const Vector3& rkV); // coordinate access inline operator const Real* () const; inline operator Real* (); inline Real operator[] (int i) const; inline Real& operator[] (int i); inline Real X () const; inline Real& X (); inline Real Y () const; inline Real& Y (); inline Real Z () const; inline Real& Z (); // assignment inline Vector3& operator= (const Vector3& rkV); // comparison bool operator== (const Vector3& rkV) const; bool operator!= (const Vector3& rkV) const; bool operator< (const Vector3& rkV) const; bool operator<= (const Vector3& rkV) const; bool operator> (const Vector3& rkV) const; bool operator>= (const Vector3& rkV) const; // arithmetic operations inline Vector3 operator+ (const Vector3& rkV) const; inline Vector3 operator- (const Vector3& rkV) const; inline Vector3 operator* (Real fScalar) const; inline Vector3 operator/ (Real fScalar) const; inline Vector3 operator- () const; // arithmetic updates inline Vector3& operator+= (const Vector3& rkV); inline Vector3& operator-= (const Vector3& rkV); inline Vector3& operator*= (Real fScalar); inline Vector3& operator/= (Real fScalar); // vector operations inline Real Length () const; inline Real SquaredLength () const; inline Real Dot (const Vector3& rkV) const; inline Real Normalize (); // The cross products are computed using the right-handed rule. Be aware // that some graphics APIs use a left-handed rule. If you have to compute // a cross product with these functions and send the result to the API // that expects left-handed, you will need to change sign on the vector // (replace each component value c by -c). inline Vector3 Cross (const Vector3& rkV) const; inline Vector3 UnitCross (const Vector3& rkV) const; // Compute the barycentric coordinates of the point with respect to the // tetrahedron , P = b0*V0 + b1*V1 + b2*V2 + b3*V3, where // b0 + b1 + b2 + b3 = 1. void GetBarycentrics (const Vector3& rkV0, const Vector3& rkV1, const Vector3& rkV2, const Vector3& rkV3, Real afBary[4]) const; // Gram-Schmidt orthonormalization. Take linearly independent vectors // U, V, and W and compute an orthonormal set (unit length, mutually // perpendicular). static void Orthonormalize (Vector3& rkU, Vector3& rkV, Vector3& rkW); static void Orthonormalize (Vector3* akV); // Input W must be a nonzero vector. The output is an orthonormal basis // {U,V,W}. The input W is normalized by this function. If you know // W is already unit length, use GenerateComplementBasis to compute U // and V. static void GenerateOrthonormalBasis (Vector3& rkU, Vector3& rkV, Vector3& rkW); // Input W must be a unit-length vector. The output vectors {U,V} are // unit length and mutually perpendicular, and {U,V,W} is an orthonormal // basis. static void GenerateComplementBasis (Vector3& rkU, Vector3& rkV, const Vector3& rkW); // Compute the extreme values. static void ComputeExtremes (int iVQuantity, const Vector3* akPoint, Vector3& rkMin, Vector3& rkMax); // special vectors WM4_FOUNDATION_ITEM static const Vector3 ZERO; // (0,0,0) WM4_FOUNDATION_ITEM static const Vector3 UNIT_X; // (1,0,0) WM4_FOUNDATION_ITEM static const Vector3 UNIT_Y; // (0,1,0) WM4_FOUNDATION_ITEM static const Vector3 UNIT_Z; // (0,0,1) WM4_FOUNDATION_ITEM static const Vector3 ONE; // (1,1,1) private: // support for comparisons int CompareArrays (const Vector3& rkV) const; Real m_afTuple[3]; }; // arithmetic operations template Vector3 operator* (Real fScalar, const Vector3& rkV); // debugging output template std::ostream& operator<< (std::ostream& rkOStr, const Vector3& rkV); #include "Wm4Vector3.inl" typedef Vector3 Vector3f; typedef Vector3 Vector3d; } #endif