terom@185: #ifndef VECTOR_HH terom@185: #define VECTOR_HH terom@185: terom@185: #include terom@185: #include terom@185: terom@185: /** terom@185: * A 2D Vector class. Implements standard vector operations. terom@185: */ terom@185: template terom@185: class _Vector { terom@185: public: terom@185: T x; terom@185: T y; terom@185: terom@185: /** terom@185: * Default constructor. terom@185: */ terom@185: _Vector() : x(0), y(0) {} terom@185: terom@185: /** terom@185: * Constuctor. terom@185: * terom@185: * @param x Initial x-coordinate terom@185: * @param y Initial y-coordinate terom@185: */ terom@185: _Vector(T x, T y) : x(x), y(y) {} terom@185: terom@185: /** terom@185: * Copy constructor. terom@185: * terom@185: * @param v Vector to be copied. terom@185: */ terom@185: _Vector(const _Vector &v) : x(v.x), y(v.y) {} terom@185: terom@185: // Operator declarations terom@185: void operator=(const _Vector &v) { terom@185: this->x = v.x; terom@185: this->y = v.y; terom@185: } terom@185: _Vector operator+(const _Vector &v) const { terom@185: return _Vector(this->x+v.x, this->y+v.y); terom@185: } terom@185: _Vector operator-(const _Vector &v) const { terom@185: return _Vector(this->x-v.x, this->y-v.y); terom@185: } terom@185: _Vector operator*(const T &scalar) const { terom@185: return _Vector(this->x*scalar, this->y*scalar); terom@185: } terom@185: T operator*(const _Vector &v) const { terom@185: return (this->x*v.x + this->y*v.y); terom@185: } ekku@247: _Vector operator/ (const T &d) const { ekku@247: return _Vector(this->x / d, this->y / d); terom@185: } terom@185: void operator+=(const _Vector &v) { terom@185: *this = *this + v; terom@185: } terom@185: void operator-=(const _Vector &v) { terom@185: *this = *this - v; terom@185: } terom@185: void operator*=(const T &scalar) { terom@185: *this = *this * scalar; terom@185: } terom@185: void operator/=(const T &scalar) { terom@185: *this = *this / scalar; terom@185: } terom@185: terom@185: // Other operations terom@185: T length() const { terom@185: return sqrt(sqrLength()); terom@185: } terom@185: T sqrLength() const { terom@185: return (this->x * this->x) + (this->y * this->y); terom@185: } terom@185: _Vector roundToInt() const { terom@185: return _Vector((int)(x), (int)(y)); terom@185: } terom@221: terom@221: // test Vectors as booleans terom@221: // XXX: comparing floats against zero... is a bad idea? terom@221: bool zero(void) const { terom@221: return x == 0 && y == 0; terom@221: } terom@185: }; terom@185: terom@185: // Unary operators terom@185: template terom@185: _Vector operator*(const T &scalar, const _Vector v) { terom@185: return (v * scalar); terom@185: } terom@185: terom@185: // Comparison operators terom@185: template terom@185: bool operator==(const _Vector &v1, const _Vector &v2) { terom@185: return ((v1.x == v2.x) && (v1.y == v2.y)); terom@185: } terom@185: template terom@185: bool operator!=(const _Vector &v1, const _Vector &v2) { terom@185: return !(v1 == v2); terom@185: } terom@185: terom@185: // Output operator terom@185: template terom@185: std::ostream& operator<<(std::ostream &s, const _Vector &v) { terom@185: return s<<"("< Vector; terom@185: terom@185: #endif