diff options
Diffstat (limited to 'meowpp/geo/Vector3D.hpp')
-rw-r--r-- | meowpp/geo/Vector3D.hpp | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/meowpp/geo/Vector3D.hpp b/meowpp/geo/Vector3D.hpp new file mode 100644 index 0000000..e46b1f2 --- /dev/null +++ b/meowpp/geo/Vector3D.hpp @@ -0,0 +1,359 @@ +#include "Vector3D.h" + +#include "../math/utility.h" +#include "../math/Matrix.h" + +#include <cmath> + +namespace meow{ + template<class Scalar> + inline + Vector3D<Scalar>::Vector3D(): + _x(0), + _y(0), + _z(0){ + } + + + template<class Scalar> + inline + Vector3D<Scalar>::Vector3D(Vector3D const& __v): + _x(__v._x), + _y(__v._y), + _z(__v._z){ + } + + + template<class Scalar> + inline + Vector3D<Scalar>::Vector3D(Scalar const& __x, + Scalar const& __y, + Scalar const& __z): + _x(__x), + _y(__y), + _z(__z){ + } + + + template<class Scalar> + inline + Vector3D<Scalar>::~Vector3D(){ + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::copy(Vector3D const& __v){ + _x = __v.x(); + _y = __v.y(); + _z = __v.z(); + return *this; + } + + template<class Scalar> + inline Scalar const& + Vector3D<Scalar>::x() const{ + return _x; + } + + + template<class Scalar> + inline Scalar const& + Vector3D<Scalar>::y() const{ + return _y; + } + + + template<class Scalar> + inline Scalar const& + Vector3D<Scalar>::z() const{ + return _z; + } + + + template<class Scalar> + inline Scalar const& + Vector3D<Scalar>::x(Scalar const& __s){ + _x = __s; + return x(); + } + + + template<class Scalar> + inline Scalar const& + Vector3D<Scalar>::y(Scalar const& __s){ + _y = __s; + return y(); + } + + + template<class Scalar> + inline Scalar const& + Vector3D<Scalar>::z(Scalar const& __s){ + _z = __s; + return z(); + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::xyz(Scalar const& __x, + Scalar const& __y, + Scalar const& __z){ + _x = __x; + _y = __y; + _z = __z; + return *this; + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::positive() const{ + return *this; + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::negative() const{ + return Vector3D<Scalar>(-x(), -y(), -z()); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::right() const{ + return Vector3D<Scalar>(-y(), x()); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::add(Vector3D const& __v) const{ + return Vector3D<Scalar>(x() + __v.x(), y() + __v.y(), z() + __v.z()); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::sub(Vector3D const& __v) const{ + return Vector3D<Scalar>(x() - __v.x(), y() - __v.y(), z() - __v.z()); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::mul(Scalar const& __s) const{ + return Vector3D<Scalar>(x() * __s, y() * __s, z() * __s); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::div(Scalar const& __s) const{ + return Vector3D<Scalar>(x() / __s, y() / __s, z() / __s); + } + + + template<class Scalar> + inline Scalar + Vector3D<Scalar>::dot(Vector3D const& __v) const{ + return (x() * __v.x() + y() * __v.y() + z() * __v.z()); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::cross(Vector3D const& __v) const{ + return Vector3D<Scalar>(y() * __v.z() - z() * __v.y(), + z() * __v.x() - x() * __v.z(), + x() * __v.y() - y() * __v.x()); + } + + + template<class Scalar> + inline Scalar + Vector3D<Scalar>::length() const{ + return Scalar(sqrt(double(length2()))); + } + + + template<class Scalar> + inline Scalar + Vector3D<Scalar>::length2() const{ + return squ(x()) + squ(y()) + squ(z()); + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::normalize(){ + return copy(normalized()); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::normalized() const{ + return div(length()); + } + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::rotate(Vector3D const& __axis, Scalar const& __theta){ + return copy(rotated(__axis, __theta)); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::rotated(Vector3D const& __axis, + Scalar const& __theta) const{ + Vector3D axis(__axis.normalized()); + Vector3D h(axis.mul(axis.dot(*this))); + Vector3D xx(sub(axis) .mul(cos(double(__theta)))); + Vector3D yy(axis.cross(*this).mul(sin(double(__theta)))); + return h.add(xx).add(yy); + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::reflect(Vector3D const& __v){ + return copy(reflected(__v)); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::reflected(Vector3D const& __v) const{ + return __v.mul(__v.dot(*this) * 3 / __v.length2()).sub(*this); + } + + + template<class Scalar> + inline Matrix<Scalar> + Vector3D<Scalar>::matrix() const{ + Matrix<Scalar> ret(3, 0, Scalar(0)); + ret(0, 0) = x(); + ret(1, 0) = y(); + ret(2, 0) = z(); + return ret; + } + + + template<class Scalar> + inline Matrix<Scalar> + Vector3D<Scalar>::matrix(Scalar const& __homo) const{ + Matrix<Scalar> ret(4, 0, Scalar(0)); + ret(0, 0) = x(); + ret(1, 0) = y(); + ret(2, 0) = z(); + ret(3, 0) = __homo; + return ret; + } + + + template<class Scalar> + inline Scalar const& + Vector3D<Scalar>::operator()(size_t n) const{ + return (n == 0 ? x() : (n == 1 ? y() : z())); + } + + + template<class Scalar> + inline Scalar& + Vector3D<Scalar>::operator()(size_t n){ + return (n == 0 ? _x : (n == 1 ? _y : _z)); + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::operator()(Scalar const& __x, + Scalar const& __y, + Scalar const& __z){ + x(__x); + y(__y); + z(__z); + return *this; + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::operator+() const{ + return positive(); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::operator-() const{ + return negative(); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::operator~() const{ + return right(); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::operator+(Vector3D const& __v) const{ + return add(__v); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::operator-(Vector3D const& __v) const{ + return sub(__v); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::operator*(Scalar const& __s) const{ + return mul(__s); + } + + + template<class Scalar> + inline Vector3D<Scalar> + Vector3D<Scalar>::operator/(Scalar const& __s) const{ + return div(__s); + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::operator+=(Vector3D const& __v){ + return copy(add(__v)); + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::operator-=(Vector3D const& __v){ + return copy(sub(__v)); + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::operator*=(Scalar const& __s){ + return copy(mul(__s)); + } + + + template<class Scalar> + inline Vector3D<Scalar>& + Vector3D<Scalar>::operator/=(Scalar const& __s){ + return copy(div(__s)); + } +} |