#include "Vector2D.h" #include "../math/utility.h" #include "../math/Matrix.h" #include namespace meow{ template inline Vector2D::Vector2D(): _x(0), _y(0){ } template inline Vector2D::Vector2D(Vector2D const& __v): _x(__v._x), _y(__v._y){ } template inline Vector2D::Vector2D(Scalar const& __x, Scalar const& __y): _x(__x), _y(__y){ } template inline Vector2D::~Vector2D(){ } template inline Vector2D& Vector2D::copy(Vector2D const& __v){ _x = __v.x(); _y = __v.y(); return *this; } template inline Scalar const& Vector2D::x() const{ return _x; } template inline Scalar const& Vector2D::y() const{ return _y; } template inline Scalar const& Vector2D::x(Scalar const& __s){ _x = __s; return x(); } template inline Scalar const& Vector2D::y(Scalar const& __s){ _y = __s; return y(); } template inline Vector2D& Vector2D::xy(Scalar const& __x, Scalar const& __y){ _x = __x; _y = __y; return *this; } template inline Vector2D Vector2D::positive() const{ return *this; } template inline Vector2D Vector2D::negative() const{ return Vector2D(-x(), -y()); } template inline Vector2D Vector2D::right() const{ return Vector2D(-y(), x()); } template inline Vector2D Vector2D::add(Vector2D const& __v) const{ return Vector2D(x() + __v.x(), y() + __v.y()); } template inline Vector2D Vector2D::sub(Vector2D const& __v) const{ return Vector2D(x() - __v.x(), y() - __v.y()); } template inline Vector2D Vector2D::mul(Scalar const& __s) const{ return Vector2D(x() * __s, y() * __s); } template inline Vector2D Vector2D::div(Scalar const& __s) const{ return Vector2D(x() / __s, y() / __s); } template inline Scalar Vector2D::dot(Vector2D const& __v) const{ return (x() * __v.x() + y() * __v.y()); } template inline Scalar Vector2D::cross(Vector2D const& __v) const{ return (x() * __v.y() - y() * __v.x()); } template inline Scalar Vector2D::length() const{ return Scalar(sqrt(double(length2()))); } template inline Scalar Vector2D::length2() const{ return squ(x()) + squ(y()); } template inline Vector2D& Vector2D::normalize(){ return copy(normalized()); } template inline Vector2D Vector2D::normalized() const{ return div(length()); } template inline Vector2D& Vector2D::rotate(Scalar const& __theta){ return copy(rotated(__theta)); } template inline Vector2D Vector2D::rotated(Scalar const& __theta) const{ Scalar cs(cos(-double(__theta))); Scalar sn(sin(-double(__theta))); Vector2D new_x(cs, sn); return Vector2D(new_x.dot(*this), new_x.cross(*this)); } template inline Vector2D& Vector2D::reflect(Vector2D const& __v){ return copy(reflected(__v)); } template inline Vector2D Vector2D::reflected(Vector2D const& __v) const{ return __v.mul(__v.dot(*this) * 2 / __v.length2()).sub(*this); } template inline Matrix Vector2D::matrix() const{ Matrix ret(2, 0, Scalar(0)); ret(0, 0) = x(); ret(1, 0) = y(); return ret; } template inline Matrix Vector2D::matrix(Scalar const& __homo) const{ Matrix ret(3, 0, Scalar(0)); ret(0, 0) = x(); ret(1, 0) = y(); ret(2, 0) = __homo; return ret; } template inline Scalar const& Vector2D::operator()(size_t n) const{ return (n == 0 ? x() : y()); } template inline Scalar& Vector2D::operator()(size_t n){ return (n == 0 ? _x : _y); } template inline Vector2D& Vector2D::operator()(Scalar const& __x, Scalar const& __y){ x(__x); y(__y); return *this; } template inline Vector2D Vector2D::operator+() const{ return positive(); } template inline Vector2D Vector2D::operator-() const{ return negative(); } template inline Vector2D Vector2D::operator~() const{ return right(); } template inline Vector2D Vector2D::operator+(Vector2D const& __v) const{ return add(__v); } template inline Vector2D Vector2D::operator-(Vector2D const& __v) const{ return sub(__v); } template inline Vector2D Vector2D::operator*(Scalar const& __s) const{ return mul(__s); } template inline Vector2D Vector2D::operator/(Scalar const& __s) const{ return div(__s); } template inline Vector2D& Vector2D::operator+=(Vector2D const& __v){ return copy(add(__v)); } template inline Vector2D& Vector2D::operator-=(Vector2D const& __v){ return copy(sub(__v)); } template inline Vector2D& Vector2D::operator*=(Scalar const& __s){ return copy(mul(__s)); } template inline Vector2D& Vector2D::operator/=(Scalar const& __s){ return copy(div(__s)); } }