www.pudn.com > Gimcrack-v0.0051-Source.zip > vector.h
// ------------------------------------ // Vector class for handling vectors // ------------------------------------ #ifndef _VECTOR_H_ #define _VECTOR_H_ #include#include "point.h" // Make it easy to switch betwen var types (you only want to use one type in the same project // so templates is both unnceccessary and is harder to optimize) typedef float vectType; class GcVector2 { public: /* Everyting is declared in the header (for inlining) since */ /* speed is vital to vector calculation */ // Default constructor GcVector2(): x(0), y(0){} // Overloaded constructor allowing initialazion GcVector2(vectType sX, vectType sY): x(sX), y(sY){} // Destructor ~GcVector2() {} vectType & operator[](int i) { return array[i]; } const vectType operator[](int i) const { return array[i]; } operator float*() { return (float *)array; } /* Overload the standard math operators to work with the vector */ // Negation const GcVector2 operator-() { return GcVector2(-x, -y); } // Addition (vect1 + vect2) const GcVector2 operator+(const GcVector2 vect) { return GcVector2(x + vect.x, y + vect.y); } // Addition (vect1 += vect2) void operator+=(const GcVector2 vect) { x += vect.x; y += vect.y; } // Substraction (vector1 - vector2) const GcVector2 operator-(const GcVector2 vect) { return GcVector2(x - vect.x, y - vect.y); } const GcVector2 operator-(const GcVector2 vect) const { return GcVector2(x - vect.x, y - vect.y); } // Substraction (vector1 -= vector2) void operator-=(const GcVector2 vect) { x -= vect.x; y -= vect.y; } // Scalar multiplication (vect * scal) const GcVector2 operator*(vectType scalar) { return GcVector2(x * scalar, y * scalar); } // Scalar multiplication (vect *= scal) void operator*=(vectType scalar) { x *= scalar; y *= scalar; } // Scalar division (vect / scal) const GcVector2 operator/(vectType scalar) { return GcVector2(x / scalar, y / scalar); } // Scalar division (vect /= scal) void operator/=(vectType scalar) { x /= scalar; y /= scalar; } /* Overload the standard comperation operator */ // Equal too bool operator==(const GcVector2 vect) { return ((x == vect.x) && (y == vect.y)); } /* Common vector calculations */ // Return the lenght of the vector (in other words return |z|) const vectType Length() { return vectType(sqrt(x*x + y*y)); } // Calculate the dot product const vectType DotProduct(const GcVector2 vect) { return (x * vect.x + y * vect.y); } // Calcualte the angle betwen two vectors (in radians) const vectType AngleBetwen(GcVector2 vect) { return vectType(acos(this->DotProduct(vect) / (this->Length() * vect.Length()))); } // Normalize the vector void Normalize() { vectType length; // Clacluate the lenght of the crossproduct vector length = this->Length(); // Normalize the x /= length; y /= length; } /* The variables are public for easier access */ //vectType x, y; union { struct { vectType x, y; }; vectType array[2]; }; }; class GcVector3 { public: /* Everyting is declared in the header (for inlining) since */ /* speed is vital to vector calculation */ // Default constructor GcVector3(): x(0), y(0), z(0) {} // Overloaded constructor allowing initialazion GcVector3(vectType sX, vectType sY, vectType sZ): x(sX), y(sY), z(sZ) {} // Destructor ~GcVector3() {} vectType & operator[](int i) { return array[i]; } const vectType operator[](int i) const { return array[i]; } operator float*() { return (float *)array; } /* Overload the standard math operators to work with the vector */ // Negation GcVector3 operator-() { return GcVector3(-x, -y, -z); } // Addition (vect1 + vect2) GcVector3 operator+(const GcVector3 vect) { return GcVector3(x + vect.x, y + vect.y, z + vect.z); } // Addition (vect1 += vect2) void operator+=(const GcVector3 vect) { x += vect.x; y += vect.y; z += vect.z; } // Substraction (vector1 - vector2) GcVector3 operator-(const GcVector3 vect) { return GcVector3(x - vect.x, y - vect.y, z - vect.z); } const GcVector3 operator-(const GcVector3 vect) const { return GcVector3(x - vect.x, y - vect.y, z - vect.z); } // Substraction (vector1 -= vector2) void operator-=(const GcVector3 vect) { x -= vect.x; y -= vect.y; z -= vect.z; } // Scalar multiplication (vect * scal) GcVector3 operator*(vectType scalar) { return GcVector3(x * scalar, y * scalar, z * scalar); } // Scalar multiplication (vect *= scal) void operator*=(vectType scalar) { x *= scalar; y *= scalar; z *= scalar; } // Scalar division (vect / scal) GcVector3 operator/(vectType scalar) { return GcVector3(x / scalar, y / scalar, z / scalar); } // Scalar division (vect /= scal) void operator/=(vectType scalar) { x /= scalar; y /= scalar; z /= scalar; } /* Overload the standard comperation operator */ // Equal too bool operator==(const GcVector3 vect) { return ((x == vect.x) && (y == vect.y) && (z == vect.z)); } /* Allow points to be converted into vectors */ GcVector3 operator=(GcPoint3 point) { x = point.x; y = point.y; z = point.z; return *this; } /* Common vector calculations */ // Return the lenght of the vector (in other words return |z|) const vectType Length() { return vectType(sqrt(x*x + y*y + z*z)); } // Calculate the dot product const vectType DotProduct(const GcVector3 vect) const { return (x * vect.x + y * vect.y + z * vect.z); } // Calculate the dot product vectType operator*(const GcVector3 & vect) { return (x * vect.x + y * vect.y + z * vect.z); } // Calculate the dot product vectType operator*(const GcVector3 & vect) const { return (x * vect.x + y * vect.y + z * vect.z); } // Calcualte the angle betwen two vectors (in radians) const vectType AngleBetwen(GcVector3 vect) { return vectType(acos(this->DotProduct(vect) / (this->Length() * vect.Length()))); } // Return the cross product const GcVector3 CrossProduct(const GcVector3 vect) { return GcVector3((y * vect.z - z * vect.y), (z * vect.x - x * vect.z), (x * vect.y - y * vect.x)); } // Normalize the vector against another vector void Normalize(const GcVector3 vect) { vectType length; // Clacluate the cross product *this = this->CrossProduct(vect); // Clacluate the lenght of the crossproduct vector length = this->Length(); // Normalize the x /= length; y /= length; z /= length; } // Normalize the vector void Normalize() { vectType length; // Clacluate the lenght of the crossproduct vector length = this->Length(); // Normalize the x /= length; y /= length; z /= length; } /* The variables are public for easier access */ //vectType x, y, z; union { struct { vectType x, y, z; }; vectType array[3]; }; }; // Vector4 class class GcVector4 { public: /* Everyting is declared in the header (for inlining) since */ /* speed is vital to vector calculation */ // Default constructor GcVector4() : x(0), y(0), z(0), w(0) {} // Overloaded constructor allowing initialazion GcVector4(vectType sX, vectType sY, vectType sZ, vectType sW) : x(sX), y(sY), z(sZ), w(sW) {} // Destructor ~GcVector4() {} vectType & operator[](int i) { return array[i]; } const vectType operator[](int i) const { return array[i]; } operator float*() { return (float *)array; } /* Overload the standard math operators to work with the vector */ // Negation const GcVector4 operator-() { return GcVector4(-x, -y, -z, -w); } // Addition (vect1 + vect2) const GcVector4 operator+(const GcVector4 vect) { return GcVector4(x + vect.x, y + vect.y, z + vect.z, w + vect.w); } // Addition (vect1 += vect2) void operator+=(const GcVector4 vect) { x += vect.x; y += vect.y; z += vect.z; w += vect.w; } // Substraction (vector1 - vector2) const GcVector4 operator-(const GcVector4 vect) { return GcVector4(x - vect.x, y - vect.y, z - vect.z, w - vect.w); } const GcVector4 operator-(const GcVector4 vect) const { return GcVector4(x - vect.x, y - vect.y, z - vect.z, w - vect.w); } // Substraction (vector1 -= vector2) void operator-=(const GcVector4 vect) { x -= vect.x; y -= vect.y; z -= vect.z; w -= vect.w; } // Scalar multiplication (vect * scal) const GcVector4 operator*(vectType scalar) { return GcVector4(x * scalar, y * scalar, z * scalar, w * scalar); } // Scalar multiplication (vect *= scal) void operator*=(vectType scalar) { x *= scalar; y *= scalar; z *= scalar; w *= scalar; } // Scalar division (vect / scal) const GcVector4 operator/(vectType scalar) { return GcVector4(x / scalar, y / scalar, z / scalar, w / scalar); } // Scalar division (vect /= scal) void operator/=(vectType scalar) { x /= scalar; y /= scalar; z /= scalar; w /= scalar; } /* Overload the standard comperation operator */ // Equal too bool operator==(const GcVector4 vect) { return ((x == vect.x) && (y == vect.y) && (z == vect.z) && (w == vect.w)); } /* Common vector calculations */ // Return the length of the vector (in other words return |z|) const vectType Length() { return vectType(sqrt(x*x + y*y + z*z + w*w)); //return vectType(sqrt(x*x + y*y + z*z)); } // Calculate the dot product const vectType DotProduct(const GcVector4 vect) { return (x * vect.x + y * vect.y + z * vect.z + w * vect.w); } // Calculate the dot product vectType operator*(const GcVector4 & vect) { return (x * vect.x + y * vect.y + z * vect.z + w * vect.w); } // Calculate the dot product vectType operator*(const GcVector4 & vect) const { return (x * vect.x + y * vect.y + z * vect.z + w * vect.w); } // Calcualte the angle betwen two vectors (in radians) const vectType AngleBetween(GcVector4 vect) { return vectType(acos(this->DotProduct(vect) / (this->Length() * vect.Length()))); } // Return the cross product const GcVector4 CrossProduct(const GcVector4 vect) { GcVector4 v; v.x = y * vect.z - z * vect.y; v.y = z * vect.x - x * vect.z; v.z = x * vect.y - y * vect.z; v.w = 1.0; return v; } // Normalize the vector against another vector void Normalize(const GcVector4 vect) { vectType length; // Clacluate the cross product *this = this->CrossProduct(vect); // Clacluate the length of the crossproduct vector length = this->Length(); // Normalize the x /= length; y /= length; z /= length; w /= length; } // Normalize the vector void Normalize() { vectType length; // Clacluate the lenght of the crossproduct vector length = this->Length(); // Normalize the x /= length; y /= length; z /= length; w /= length; } // Normalize the plane (leave the distance alone) void NormalizePlane() { vectType length; // Clacluate the lenght of the crossproduct vector length = (float)sqrt(x*x + y*y + z*z); // Normalize the x /= length; y /= length; z /= length; w /= length; } GcVector4 & Homogenize() { if (w == 0) w = 1.0; x /= w; y /= w; z /= w; w = 1.0; return *this; } /* The variables are public for easier access */ union { struct { vectType x, y, z, w; }; vectType array[4]; }; // vectType x, y, z, w; }; #endif