#ifndef __XGL_VECTOR_H__ #define __XGL_VECTOR_H__ #include #ifndef MAX #define MAX(a, b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif class Vector { public: double x, y, z; // CtorVector3DDtor Vector() : x(0), y(0), z(0) { } Vector (float _c) : x(_c), y(_c), z(_c) { } Vector(float _x, float _y, float _z) : x(_x), y(_y), z(_z) { } Vector(const Vector &v) { x = v.x; y = v.y; z = v.z; } // Operators inline Vector operator += (Vector v) { x += v.x; y += v.y; z += v.z; return *this; } inline Vector operator + (Vector v) { return Vector(x + v.x, y + v.y, z + v.z); } inline Vector operator - () { return Vector(-x, -y, -z); } inline Vector operator -= (Vector v) { x -= v.x; y -= v.y; z -= v.z; return *this; } inline Vector operator - (Vector v) { return Vector(x - v.x, y - v.y, z - v.z); } inline Vector operator *= (float f) { x *= f; y *= f; z *= f; return *this; } inline Vector operator /= (float f) { x /= f; y /= f; z /= f; return *this; } inline Vector operator * (float f) { return Vector(x * f, y * f, z * f); } inline Vector operator / (float f) { return Vector(x / f, y / f, z / f); } // Dot and cross product inline float Dot(Vector v) { return x*v.x + y*v.y + z*v.z; } inline Vector Cross(Vector v) { Vector t; // a x b = (ay*bz - az*by, az*bx - ax*bz, ax*by - ay*bx) t.x = y * v.z - z * v.y; t.y = z * v.x - x * v.z; t.z = x * v.y - y * v.x; return t; } // Some utilities inline Vector Normalize() { float r = sqrt(x*x + y*y + z*z); x /= r; y /= r; z /= r; return *this; } inline void Clamp(float min, float max) { x = MIN(MAX(min, x), max); y = MIN(MAX(min, y), max); z = MIN(MAX(min, z), max); } }; #endif /* __XGL_VECTOR_H__ */