#ifndef __VECTOR3D_H__ #define __VECTOR3D_H__ #include #include // forward declarations template class Vector3D; template Vector3D operator* (T factor, const Vector3D& v); // Vector3D class template class Vector3D { public: Vector3D(const Vector3D& v); explicit Vector3D(); explicit Vector3D(const T& x, const T& y, const T& z); explicit Vector3D(const T data[3]); explicit Vector3D(const Vector3D* v); static unsigned dim() { return 3; } void set(const T&x, const T& y, const T& z); void set(const T data[3]); Vector3D& operator=(const Vector3D& src); bool operator==(const Vector3D& src) const; bool operator!=(const Vector3D& src) const { return ! (*this == src); } bool operator<(const Vector3D& src) const; void getSpheric(double& theta, double& phi) const; void getSpheric(double& distance, double& theta, double& phi) const; void setSpheric(double distance, double theta, double phi); Vector3D affineCoordinates(const Vector3D& u, const Vector3D& v) const; const T& x() const { return _data[0]; }; const T& y() const { return _data[1]; }; const T& z() const { return _data[2]; }; void x(const T& t) { _data[0] = t; }; void y(const T& t) { _data[1] = t; }; void z(const T& t) { _data[2] = t; }; T& operator[](int index); const T& operator[](int index) const; const T* getData() const {return _data;}; T* getDataRef() {return _data;}; void normalize(); void setLength(T len); T sign(const Vector3D& v) const { return ((*this)*v>=0) ? 1 : -1; } double module() const { return sqrt(squaredModule()); } double squaredModule() const; double angle(const Vector3D& v) const; double distance(const Vector3D& v) const { return sqrt(squaredDistance(v)); } double squaredDistance(const Vector3D& v) const; double infDistance(const Vector3D& v) const; double manhattanDistance(const Vector3D& v) const; double distanceToPlane(const Vector3D& P, const Vector3D& N) const; void rotateX(double angle); void rotateY(double angle); void rotateZ(double angle); T operator*(const Vector3D& v) const; T dotProduct(const Vector3D& v) const { return (*this) * v; } Vector3D operator/(T factor) const; const Vector3D& operator/=(T factor); Vector3D operator*(T factor) const; const Vector3D& operator*=(T factor); Vector3D operator^(const Vector3D& v) const; Vector3D crossProduct(const Vector3D& v) const{ return (*this)^v; } Vector3D operator*(const Vector3D* mat) const; static void transpose(Vector3D* mat); Vector3D operator-(const Vector3D& v) const; Vector3D difference(const Vector3D& v) const{ return (*this) - v; } const Vector3D& operator-=(const Vector3D& v); const Vector3D& substract(const Vector3D& v) { return (*this) -= v; } Vector3D projectX() const; Vector3D projectY() const; Vector3D projectZ() const; Vector3D project(const Vector3D& n) const; Vector3D projectAlong(const Vector3D& n, const Vector3D& v) const; Vector3D project(const Vector3D& center, const Vector3D& normal) const; Vector3D closestPointInLine(const Vector3D& P, const Vector3D& V) const; Vector3D intersect(const Vector3D& center, const Vector3D& normal) const; Vector3D intersect(const Vector3D& center, const Vector3D& normal, const Vector3D& direction) const; Vector3D perpendicular() const; double squaredSignedDistanceToPlane(const Vector3D& center, const Vector3D& normal) const; Vector3D operator+(const Vector3D& v) const; Vector3D sum(const Vector3D& v) const { return (*this) + v; } const Vector3D& operator+=(const Vector3D& v); const Vector3D& add(const Vector3D& v){ return (*this) += v; } private: T _data[3]; }; // Needed operator* that I don't know how to move to the cpp template Vector3D operator* (T factor, const Vector3D& v) { return v * factor; } // Needed operator* that I don't know how to move to the cpp template Vector3D operator- (const Vector3D& v) { return Vector3D(-v.x(), -v.y(), -v.z()); } typedef Vector3D Vector3Di; typedef Vector3D Vector3Df; typedef Vector3D Vector3Dd; typedef Vector3D Vector3Ds; typedef Vector3D Vector3Dc; #endif