www.pudn.com > coolMEMORY.rar > AS_Vector.h


//----------------------------------------------------------------------------- 
// File: AS_Vector.h 
//----------------------------------------------------------------------------- 
 
#ifndef __AS_VECTOR_H__ 
#define __AS_VECTOR_H__ 
 
 
// Classes: ******************************************************************* 
typedef class AS_2D_VECTOR 
{ 
	public: 
		union 
		{ 
			FLOAT2 fV; 
			struct 
			{ 
				float fX, fY; 
			}; 
		}; 
 
		// Constructor: 
		AS_2D_VECTOR(void) { fX = fY = 0.0f; } 
		AS_2D_VECTOR(float fXT, float fYT) { fY = fXT, fY = fYT; } 
		AS_2D_VECTOR(const float *fV) { *this = fV; } 
		AS_2D_VECTOR(const AS_2D_VECTOR &V) { *this = V; } 
 
		// Assignment operators: 
		AS_2D_VECTOR &operator=(const float *fV) 
		{ 
			fX = *fV++, fY = *fV; 
			return  *this; 
		} 
		AS_2D_VECTOR &operator=(const AS_2D_VECTOR &V) 
		{ 
			fX = V.fX, fY = V.fY; 
			return *this; 
		} 
		AS_2D_VECTOR &operator=(const float fD) 
		{ 
			fX = fY = fD; 
			return *this; 
		} 
 
		// Comparison: 
		BOOL operator==(const AS_2D_VECTOR V) 
		{ return fX == V.fX && fY == V.fY; } 
		BOOL operator!=(const AS_2D_VECTOR V) 
		{ return !(*this == V); } 
 
		// Vector: 
	    AS_2D_VECTOR operator - () 
		{ return AS_2D_VECTOR(-fX, -fY); } 
		AS_2D_VECTOR &operator+=(const AS_2D_VECTOR V) 
		{ 
			fX += V.fX, fY += V.fY; 
			return *this; 
		} 
		AS_2D_VECTOR operator+(const AS_2D_VECTOR V) 
		{ return AS_2D_VECTOR(fX+V.fX, fY+V.fY); } 
		AS_2D_VECTOR &operator+=(const float fN) 
		{ 
			fX += fN, fY += fN; 
			return *this; 
		} 
		AS_2D_VECTOR operator+(const float fN) 
		{ return AS_2D_VECTOR(fX+fN, fY+fN); } 
		AS_2D_VECTOR &operator-=(const AS_2D_VECTOR V) 
		{ 
			fX -= V.fX, fY -= V.fY; 
			return *this; 
		} 
		AS_2D_VECTOR operator-(const AS_2D_VECTOR V) 
		{ return AS_2D_VECTOR(fX-V.fX, fY-V.fY); } 
		AS_2D_VECTOR &operator-=(const float fN) 
		{ 
			fX -= fN, fY -= fN; 
			return *this; 
		} 
		AS_2D_VECTOR operator-(const float fN) 
		{ return AS_2D_VECTOR(fX-fN, fY-fN); } 
		AS_2D_VECTOR &operator*=(const AS_2D_VECTOR V) 
		{ 
			fX *= V.fX, fY *= V.fY; 
			return *this; 
		} 
		AS_2D_VECTOR operator*(const AS_2D_VECTOR V) 
		{ return AS_2D_VECTOR(fX*V.fX, fY*V.fY); } 
		AS_2D_VECTOR &operator/=(const AS_2D_VECTOR V) 
		{ 
			fX /= V.fX, fY /= V.fY; 
			return *this; 
		} 
		AS_2D_VECTOR operator/(const AS_2D_VECTOR V) 
		{ return AS_2D_VECTOR(fX/V.fX, fY/V.fY); } 
 
		// Scalar 
		AS_2D_VECTOR &operator*=(float fS) 
		{ 
			fX *= fS, fY *= fS; 
			return *this; 
		} 
		AS_2D_VECTOR operator*(float fS) 
		{ return AS_2D_VECTOR(fX*fS, fY*fS); } 
		AS_2D_VECTOR &operator/=(float fS) 
		{ 
			fX /= fS, fY /= fS; 
			return *this; 
		} 
		AS_2D_VECTOR operator/(float fS) 
		{ return AS_2D_VECTOR(fX/fS, fY/fS); } 
 
		// Stuff: 
		float GetLength(void) { return (float) ASFastSqrt(fX*fX+fY*fY); } 
		void SetLength(float fL) { *this *= fL/GetLength(); } 
 
		AS_2D_VECTOR &Normalize(void) 
		{ 
			float fU = fX*fX+fY*fY; 
			if(fabs(fU-1.0) < AS_EPSILON) 
				return *this; 
			fU = 1.0f/(float) ASFastSqrt(fU); 
			*this *= fU; 
			return *this; 
		} 
 
		AS_2D_VECTOR GetNormalized(void) 
		{ return AS_2D_VECTOR(*this).Normalize(); } 
 
		float DotProduct(void) { return fX*fX+fY*fY; } 
		float DotProduct(const AS_2D_VECTOR V) { return fX*V.fX+fY*V.fY; } 
 
		// Misc: 
		BOOL IsNull(void) 
		{ 
			if(!fX && !fY) 
				return TRUE; 
			return FALSE; 
		} 
 
} AS_2D_VECTOR; 
 
typedef class AS_3D_VECTOR 
{ 
	public: 
		union 
		{ 
			FLOAT3 fV; 
			struct 
			{ 
				float fX, fY, fZ; 
			}; 
			struct 
			{ 
				float fHeading, fPitch, fRoll; 
			}; 
		}; 
 
		// Constructor: 
		AS_3D_VECTOR(void) { fX = fY = fZ = 0.0f; } 
		AS_3D_VECTOR(float fXT, float fYT, float fZT) 
		{ fX = fXT, fY = fYT, fZ = fZT; } 
		AS_3D_VECTOR(const float *fV) { *this = fV; } 
		AS_3D_VECTOR(const AS_3D_VECTOR &V) { *this = V; } 
 
		// Assignment operators: 
		AS_3D_VECTOR &operator=(const AS_3D_VECTOR &V) 
		{ 
			fX = V.fX, fY = V.fY, fZ = V.fZ; 
			return *this; 
		} 
		AS_3D_VECTOR &operator=(const float *fV) 
		{ 
			fX = *fV++, fY = *fV++, fZ = *fV; 
			return *this; 
		} 
		AS_3D_VECTOR &operator=(const float fD) 
		{ 
			fX = fY = fZ = fD; 
			return *this; 
		} 
 
		// Comparison: 
		BOOL operator==(const AS_3D_VECTOR &V) 
		{ return fX == V.fX && fY == V.fY && fZ == V.fZ; } 
		BOOL operator!=(const AS_3D_VECTOR V) 
		{ return !(*this == V); } 
 
		// Vector: 
	    AS_3D_VECTOR operator - () 
		{ return AS_3D_VECTOR(-fX, -fY, -fZ); } 
		AS_3D_VECTOR &operator+=(const AS_3D_VECTOR V) 
		{ 
			fX += V.fX, fY += V.fY, fZ += V.fZ; 
			return *this; 
		} 
		AS_3D_VECTOR operator+(const AS_3D_VECTOR V) 
		{ return AS_3D_VECTOR(fX+V.fX, fY+V.fY, fZ+V.fZ); } 
		AS_3D_VECTOR &operator+=(const float fN) 
		{ 
			fX += fN, fY += fN, fZ += fN; 
			return *this; 
		} 
		AS_3D_VECTOR operator+(const float fN) 
		{ return AS_3D_VECTOR(fX+fN, fY+fN, fZ+fN); } 
		AS_3D_VECTOR &operator-=(const AS_3D_VECTOR V) 
		{ 
			fX -= V.fX, fY -= V.fY, fZ -= V.fZ; 
			return *this; 
		} 
		AS_3D_VECTOR operator-(const AS_3D_VECTOR V) 
		{ return AS_3D_VECTOR(fX-V.fX, fY-V.fY, fZ-V.fZ); } 
		AS_3D_VECTOR &operator-=(const float fN) 
		{ 
			fX -= fN, fY -= fN, fZ -= fN; 
			return *this; 
		} 
		AS_3D_VECTOR operator-(const float fN) 
		{ return AS_3D_VECTOR(fX-fN, fY-fN, fZ-fN); } 
		AS_3D_VECTOR &operator*=(const AS_3D_VECTOR V) 
		{ 
			fX *= V.fX, fY *= V.fY, fZ *= V.fZ; 
			return *this; 
		} 
		AS_3D_VECTOR operator*(const AS_3D_VECTOR V) 
		{ return AS_3D_VECTOR(fX*V.fX, fY*V.fY, fZ*V.fZ); } 
		AS_3D_VECTOR &operator/=(const AS_3D_VECTOR V) 
		{ 
			fX /= V.fX, fY /= V.fY, fZ /= V.fZ; 
			return *this; 
		} 
		AS_3D_VECTOR operator/(const AS_3D_VECTOR V) 
		{ return AS_3D_VECTOR(fX/V.fX, fY/V.fY, fZ/V.fZ); } 
 
		// Scalar: 
		AS_3D_VECTOR &operator*=(float fS) 
		{ 
			fX *= fS, fY *= fS, fZ *= fS; 
			return *this; 
		} 
		AS_3D_VECTOR operator*(float fS) 
		{ return AS_3D_VECTOR(fX*fS, fY*fS, fZ*fS); } 
		AS_3D_VECTOR &operator/=(float fS) 
		{ 
			*this*=1.0f/fS; 
			return *this; 
		} 
		AS_3D_VECTOR operator/(float fS) 
		{ return operator*(1.0f/fS); } 
 
		// Stuff: 
		float GetLength(void) { return (float) ASFastSqrt(fX*fX+fY*fY+fZ*fZ); } 
		void SetLength(float fL) { *this *= fL/GetLength(); } 
 
		AS_3D_VECTOR &Normalize(void) 
		{ 
			float fU = fX*fX+fY*fY+fZ*fZ; 
			if(fabs(fU-1.0) < AS_EPSILON) 
				return *this; 
			fU = 1.0f/(float) ASFastSqrt(fU); 
			*this *= fU; 
			return *this; 
		} 
 
		AS_3D_VECTOR GetNormalized(void) 
		{ return AS_3D_VECTOR(*this).Normalize(); } 
 
		AS_3D_VECTOR CrossProduct(const AS_3D_VECTOR V) 
		{ 
			return AS_3D_VECTOR((fY*V.fZ)-(fZ*V.fY), 
								(fZ*V.fX)-(fX*V.fZ), 
								(fX*V.fY)-(fY*V.fX)); 
		} 
		float AngleBetween(AS_3D_VECTOR V) 
		{ return (DotProduct(V)/(GetLength()*V.GetLength())); } 
 
		float DotProduct(void) { return fX*fX+fY*fY+fZ*fZ; } 
		float DotProduct(const AS_3D_VECTOR V) { return fX*V.fX+fY*V.fY+fZ*V.fZ; } 
 
		// Misc: 
		BOOL IsNull(void) 
		{ 
			if(!fX && !fY && !fZ) 
				return TRUE; 
			return FALSE; 
		} 
 
} AS_3D_VECTOR; 
/////////////////////////////////////////////////////////////////////////////// 
 
 
inline float ASGetLengthOfVector(AS_3D_VECTOR vV) 
{ // begin ASGetLengthOfVector() 
	return (float) ASFastSqrt(vV.fX*vV.fX+vV.fY*vV.fY+vV.fZ*vV.fZ); 
} // end ASGetLengthOfVector() 
 
 
#endif // __AS_VECTOR_H__