#ifndef __VECTOR3D_H__ #define __VECTOR3D_H__ #include #include #define ABS(x) ((x)>0?(x):(-x)) #define MAX(x,y) ((x)>(y)?(x):(y)) #define MIN(x,y) ((x)<(y)?(x):(y)) #define RAD2DEG(x) (180*(x)/M_PI) #define DEG2RAD(x) (M_PI*(x)/180) #define ALMOST_ZERO 0.0001 double normalize(double min, double max, double value); namespace Geometry { // Messy but needed predeclarations template class Vector3D; template Vector3D operator* (T factor, const Vector3D& v); template std::ostream& operator<< (std::ostream& out, const Vector3D& v); template std::istream& operator>> (std::istream& in, 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); Vector3D& operator=(const Vector3D& 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); 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* getData() const {return _data;}; T* getDataRef() {return _data;}; friend std::ostream& operator<< <>(std::ostream& out, const Vector3D& v); friend std::istream& operator>> <>(std::istream& in, Vector3D& v); void normalize(); double module() const; double squaredModule() const; double angle(const Vector3D& v) const; double distance(const Vector3D& v) const; double squaredDistance(const Vector3D& v) const; double infDistance(const Vector3D& v) const; double manhattanDistance(const Vector3D& v) const; void rotateX(double angle); void rotateY(double angle); void rotateZ(double angle); double dotProduct(const Vector3D& v) const; double operator*(const Vector3D& v) const; Vector3D operator/(T factor) const; const Vector3D& operator/=(T factor); Vector3D operator*(T factor) const; const Vector3D& operator*=(T factor); friend Vector3D operator* <>(T factor, const Vector3D& v); Vector3D crossProduct(const Vector3D& v) const; Vector3D operator^(const Vector3D& v) const; Vector3D difference(const Vector3D& v) const; Vector3D operator-(const Vector3D& v) const; const Vector3D& substract(const Vector3D& v); const Vector3D& operator-=(const Vector3D& v); friend Vector3D operator- <>(const Vector3D& v); Vector3D sum(const Vector3D& v) const; Vector3D operator+(const Vector3D& v) const; const Vector3D& add(const Vector3D& v); const Vector3D& operator+=(const Vector3D& v); protected: 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._data[0], -v._data[1], -v._data[2]); } // Output operator // Format: "(a.aa, b.bbb, c.c)" template std::ostream& operator<< (std::ostream& out, const Vector3D& v) { out << v._data[0] << " " << v._data[1] << " " << v._data[2]; return out; } // Input operator // Format: "a.aa b.bbb c.c" template std::istream& operator>> (std::istream& in, Vector3D& v) { in >> v._data[0] >> v._data[1] >> v._data[2]; return in; } typedef Vector3D Vector3Di; typedef Vector3D Vector3Df; typedef Vector3D Vector3Dd; typedef Vector3D Vector3Ds; typedef Vector3D Vector3Dc; }; #endif