#ifndef QuickHull_Vector3_hpp #define QuickHull_Vector3_hpp #include #include namespace quickhull { template class Vector3 { public: Vector3() = default; Vector3(T x, T y, T z) : x(x), y(y), z(z) { } T x,y,z; T dotProduct(const Vector3& other) const { return x*other.x+y*other.y+z*other.z; } void normalize() { const T len = getLength(); x/=len; y/=len; z/=len; } Vector3 getNormalized() const { const T len = getLength(); return Vector3(x/len,y/len,z/len); } T getLength() const { return std::sqrt(x*x+y*y+z*z); } Vector3 operator-(const Vector3& other) const { return Vector3(x-other.x,y-other.y,z-other.z); } Vector3 operator+(const Vector3& other) const { return Vector3(x+other.x,y+other.y,z+other.z); } Vector3& operator+=(const Vector3& other) { x+=other.x; y+=other.y; z+=other.z; return *this; } Vector3& operator-=(const Vector3& other) { x-=other.x; y-=other.y; z-=other.z; return *this; } Vector3& operator*=(T c) { x*=c; y*=c; z*=c; return *this; } Vector3& operator/=(T c) { x/=c; y/=c; z/=c; return *this; } Vector3 operator-() const { return Vector3(-x,-y,-z); } template Vector3 operator*(S c) const { return Vector3(x*c,y*c,z*c); } template Vector3 operator/(S c) const { return Vector3(x/c,y/c,z/c); } T getLengthSquared() const { return x*x + y*y + z*z; } bool operator!=(const Vector3& o) const { return x != o.x || y != o.y || z != o.z; } // Projection onto another vector Vector3 projection(const Vector3& o) const { T C = dotProduct(o)/o.getLengthSquared(); return o*C; } Vector3 crossProduct (const Vector3& rhs ) { T a = y * rhs.z - z * rhs.y ; T b = z * rhs.x - x * rhs.z ; T c = x * rhs.y - y * rhs.x ; Vector3 product( a , b , c ) ; return product ; } T getDistanceTo(const Vector3& other) const { Vector3 diff = *this - other; return diff.getLength(); } T getSquaredDistanceTo(const Vector3& other) const { const T dx = x-other.x; const T dy = y-other.y; const T dz = z-other.z; return dx*dx+dy*dy+dz*dz; } }; // Overload also << operator for easy printing of debug data template inline std::ostream& operator<<(std::ostream& os, const Vector3& vec) { os << "(" << vec.x << "," << vec.y << "," << vec.z << ")"; return os; } template inline Vector3 operator*(T c, const Vector3& v) { return Vector3(v.x*c,v.y*c,v.z*c); } } #endif