/* * vectors.h */ template class Vect { public: C x, y, z; Vect(); Vect(C a); Vect(C a, C b, C c); Vect& operator+=(Vect v); Vect& operator-=(Vect v); Vect& operator+=(C a); Vect& operator-=(C a); Vect& operator*=(C a); Vect& operator/=(C a); Vect operator-(); bool operator>(Vect v); bool operator<(Vect v); C length(); Vect normalize(); void self_normalize(); Vect rotate_x(C a); Vect rotate_y(C a); Vect rotate_z(C a); }; template Vect::Vect() { x = 0; y = 0; z = 0; } template Vect::Vect(C a) { x = a; y = a; z = a; } template Vect::Vect(C a, C b, C c) { x = a; y = b; z = c; } template Vect& Vect::operator+=(Vect v) { x += v.x; y += v.y; z += v.z; return *this; } template Vect& Vect::operator-=(Vect v) { x -= v.x; y -= v.y; z -= v.z; return *this; } template Vect& Vect::operator+=(C a) { x += a; y += a; z += a; return *this; } template Vect& Vect::operator-=(C a) { x -= a; y -= a; z -= a; return *this; } template Vect& Vect::operator*=(C a) { x *= a; y *= a; z *= a; return *this; } template Vect& Vect::operator/=(C a) { x /= a; y /= a; z /= a; return *this; } template Vect Vect::operator-() { Vect result; result.x = -this->x; result.y = -this->y; result.z = -this->z; return result; } template bool Vect::operator>(Vect v) { return (x > v.x && y > v.y && z > v.z); } template bool Vect::operator<(Vect v) { return (x < v.x && y < v.y && z < v.z); } template C Vect::length() { return sqrt(x*x + y*y + z*z); } template Vect Vect::normalize() { Vect result; result.x = x/this->length(); result.y = y/this->length(); result.z = z/this->length(); return result; } template void Vect::self_normalize() { C len = this->length(); x /= len; y /= len; z /= len; } // temporary rotation methods until I get transforms sorted out template Vect Vect::rotate_x(C a) { Vect result; result.x = x; result.y = y*cos(a) - z*sin(a); result.z = y*sin(a) + z*cos(a); return result; } template Vect Vect::rotate_y(C a) { Vect result; result.x = x*cos(a) + z*sin(a); result.y = y; result.z = -x*sin(a) + z*cos(a); return result; } template Vect Vect::rotate_z(C a) { Vect result; result.x = x*cos(a) - y*sin(a); result.y = x*sin(a) + y*cos(a); result.z = z; return result; } template Vect operator+(Vect a, Vect b) { Vect result = a; return result += b; } template Vect operator-(Vect a, Vect b) { Vect result = a; return result -= b; } template Vect operator+(Vect a, C b) { Vect result = a; return result += b; } template Vect operator-(Vect a, C b) { Vect result = a; return result -= b; } template Vect operator*(Vect a, C b) { Vect result = a; return result *= b; } template Vect operator*(C b, Vect a) { Vect result = a; return result *= b; } template Vect operator/(Vect a, C b) { Vect result = a; return result /= b; } template Vect normalize(Vect a) { Vect result = a; return a.normalize(); } template C dot(Vect a, Vect b) { return a.x*b.x + a.y*b.y + a.z*b.z; } template Vect cross(Vect a, Vect b) { Vect result; result.x = a.y*b.z - a.z*b.y; result.y = a.z*b.x - a.x*b.z; result.z = a.x*b.y - a.y*b.x; return result; }