//! \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 Прибавить координаты второй точки и сохранить. void operator +=(const PIPoint & p) {translate(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 -(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 Проверить равенство координат двух точек. 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 Перегруженный оператор для вывода координат. template PICout operator <<(PICout & s, const PIPoint & v) { s.setControl(0, true); s << "Point{" << v.x << ", " << v.y << "}"; s.restoreControl(); return s; } typedef PIPoint PIPointi; typedef PIPoint PIPointu; typedef PIPoint PIPointf; typedef PIPoint PIPointd; #endif // PIPOINT_H