#ifndef POINT_H #define POINT_H #include "types.h" #include #include template class TSize; template class TPoint { public: inline TPoint() : x(0), y(0) {}; inline TPoint(T x, T y) : x(x), y(y) { }; inline TPoint(const TPoint& other) : x(other.x), y(other.y) { }; inline bool isNull() const { return x==0 && y==0; } inline TSize toSize() const { return TSize(x, y); } inline TPoint operator-() const { return TPoint(-x, -y); } inline TPoint operator+(const TPoint& other) const { return TPoint(x + other.x, y + other.y); } inline TPoint& operator+=(const TPoint& other) { x+=other.x; y+=other.y; return *this; } inline TPoint operator-(const TPoint& other) const { return TPoint(x - other.x, y - other.y); } inline TPoint& operator-=(const TPoint& other) { x-=other.x; y-=other.y; return *this; } inline TPoint operator*(const TPoint& other) const { return TPoint(x * other.x, y * other.y); } inline TPoint& operator*=(const TPoint& other) { x*=other.x; y*=other.y; return *this; } inline TPoint operator*(const T v) const { return TPoint(x * v, y * v); } inline TPoint& operator*=(const T v) { x*=v; y*=v; return *this; } inline TPoint operator/(const TPoint& other) const { return TPoint(x/other.x, y/other.y); } inline TPoint& operator/=(const TPoint& other) { x/=other.x; y/=other.y; return *this; } inline TPoint operator/(const T v) const { return TPoint(x/v, y/v); } inline TPoint& operator/=(const T v) { x/=v; y/=v; return *this; } inline bool operator<=(const TPoint&other) const { return x<=other.x && y<=other.y; } inline bool operator>=(const TPoint&other) const { return x>=other.x && y>=other.y; } inline bool operator<(const TPoint&other) const { return x(const TPoint&other) const { return x>other.x && y>other.y; } inline TPoint& operator=(const TPoint& other) { x = other.x; y = other.y; return *this; } inline bool operator==(const TPoint& other) const { return other.x==x && other.y==y; } inline bool operator!=(const TPoint& other) const { return other.x!=x || other.y!=y; } inline float length() const { return sqrtf((float)(x*x + y*y)); } inline T manhattanLength() const { return std::abs(x) + std::abs(y); } inline float distanceFrom(const TPoint& other) const { return TPoint(x - other.x, y - other.y).getLength(); } T x, y; }; typedef TPoint Point; typedef TPoint PointF; template inline std::ostream& operator<<(std::ostream& out, const TPoint& point) { out << "Point(" << point.x << "," << point.y << ")"; return out; } #endif