//! \file pipoint.h //! \ingroup Math //! \brief //! \~english Two-dimensional point class //! \~russian Класс двумерной точки /* PIP - Platform Independent Primitives Two-dimensional point class Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef PIPOINT_H #define PIPOINT_H #include "pimathbase.h" //! \brief //! \~english Two-dimensional point class //! \~russian Класс двумерной точки //! \details //! Данный класс позволяет хранить и работать с двумерными точками. //! Для работы с объектами реализованы операторы сложения, вычитания и проверки на ревенство и неравенство. //! Также доступны методы для перемещения точек \a translate(), \a translated(), \a move(), \a moved() //! и перевода из декартовой системы координат в полярную \a toPolar() и обратно \a fromPolar(). template class PIP_EXPORT PIPoint { static_assert(std::is_arithmetic::value, "Type must be arithmetic"); public: Type x; Type y; //! \~russian Создает новую точку. PIPoint() { x = y = Type(); } //! \~russian Создает новую точку с заданными координатами. PIPoint(Type x_, Type y_) { set(x_, y_); } //! \~russian Задать новые координаты точке. PIPoint & set(Type x_, Type y_) { x = x_; y = y_; return *this; } //! \~russian Задать новые координаты точке. PIPoint & set(const PIPoint & p) { x = p.x; y = p.y; return *this; } //! \~russian Переместить точку. PIPoint & translate(Type x_, Type y_) { x += x_; y += y_; return *this; } //! \~russian Переместить точку. PIPoint & translate(const PIPoint & p) { x += p.x; y += p.y; return *this; } //! \~russian Создать копию точки и переместить её. PIPoint translated(Type x_, Type y_) const { PIPoint rp(*this); rp.translate(x_, y_); return rp; } //! \~russian Создать копию точки и переместить её. PIPoint translated(const PIPoint & p) const { PIPoint rp(*this); rp.translate(p); return rp; } //! \~russian Переместить точку. //! \details Является копией метода \a translate(). PIPoint & move(Type x_, Type y_) { return translate(x_, y_); } //! \~russian Переместить точку. //! \details Является копией метода \a translate(). PIPoint & move(const PIPoint & p) { return translate(p); } //! \~russian Создать копию точки и переместить её. //! \details Является копией метода \a translated(). PIPoint moved(Type x_, Type y_) const { PIPoint rp(*this); rp.translate(x_, y_); return rp; } //! \~russian Создать копию точки и переместить её. //! \details Является копией метода \a translated(). PIPoint moved(const PIPoint & p) const { PIPoint rp(*this); rp.translate(p); return rp; } //! \~russian Посчитать угол(радианы) в поолярной системе координат. double angleRad() const { return atan2(y, x); } //! \~russian Посчитать угол(градусы) в поолярной системе координат. double angleDeg() const { return toDeg(atan2(y, x)); } //! \~russian Перевести копию точки в полярную систему координат. PIPoint toPolar(bool isDeg = false) const { return PIPoint(sqrt(x * x + y * y), isDeg ? angleDeg() : angleRad()); } //! \~russian Перевести копию точки из полярной системы координат в декартовую. static PIPoint fromPolar(const PIPoint & p) { return PIPoint(p.y * cos(p.x), p.y * sin(p.x)); } //! \~russian //! Прибавить координаты второй точки и сохранить. //! \details Является копией метода \a translate(). PIPoint & operator+=(const PIPoint & p) { translate(p); return *this; } PIPoint & operator*=(Type v) { x *= v; y *= v; return *this; } PIPoint & operator/=(Type v) { x /= v; y /= v; return *this; } //! \~russian Сложить координаты двух точек. PIPoint operator+(const PIPoint & p) { return PIPoint(x + p.x, y + p.y); } //! \~russian Прибавить к координатам одинаковое значение. PIPoint operator+(const Type & p) { return PIPoint(x + p, y + p); } //! \~russian Вычесть из координат координаты второй точки - найти смещение. PIPoint operator-(const PIPoint & p) { return PIPoint(x - p.x, y - p.y); } //! \~russian Вычесть из координат одинаковое значение. PIPoint operator-(const Type & p) { return PIPoint(x - p, y - p); } //! \~russian Инвертировать координаты точки. PIPoint operator-() { return PIPoint(-x, -y); } //! \~russian Умножить координаты точки. PIPoint operator*(Type v) { return PIPoint(x * v, y * v); } //! \~russian Делить координаты точки. PIPoint operator/(Type v) { return PIPoint(x / v, y / v); } //! \~russian Проверить равенство координат двух точек. bool operator==(const PIPoint & p) const { return (x == p.x && y == p.y); } //! \~russian Проверить неравенство координат двух точек. bool operator!=(const PIPoint & p) const { return (x != p.x || y != p.y); } }; //! \~russian Перегруженный оператор для вывода координат в \a PICout. template PICout operator<<(PICout & s, const PIPoint & v) { s.space(); s.saveAndSetControls(0); s << "Point{" << v.x << ", " << v.y << "}"; s.restoreControls(); return s; } typedef PIPoint PIPointi; typedef PIPoint PIPointu; typedef PIPoint PIPointf; typedef PIPoint PIPointd; #endif // PIPOINT_H