//! \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 Класс двумерной точки template class PIP_EXPORT PIPoint { static_assert(std::is_arithmetic::value, "Type must be arithmetic"); public: Type x; Type y; //! PIPoint() {x = y = Type();} //! PIPoint(Type x_, Type y_) {set(x_, y_);} //! PIPoint & set(Type x_, Type y_) { x = x_; y = y_; return *this; } //! PIPoint & set(const PIPoint & p) { x = p.x; y = p.y; return *this; } //! PIPoint & translate(Type x_, Type y_) { x += x_; y += y_; return *this; } //! PIPoint & translate(const PIPoint & p) { x += p.x; y += p.y; return *this; } //! PIPoint translated(Type x_, Type y_) const { PIPoint rp(*this); rp.translate(x_, y_); return rp; } //! PIPoint translated(const PIPoint & p) const { PIPoint rp(*this); rp.translate(p); return rp; } //! PIPoint & move(Type x_, Type y_) {return translate(x_, y_);} //! PIPoint & move(const PIPoint & p) {return translate(p);} //! PIPoint moved(Type x_, Type y_) const { PIPoint rp(*this); rp.translate(x_, y_); return rp; } //! PIPoint moved(const PIPoint & p) const { PIPoint rp(*this); rp.translate(p); return rp; } //! double angleRad() const {return atan2(y, x);} //! double angleDeg() const {return toDeg(atan2(y, x));} //! PIPoint toPolar(bool isDeg = false) const {return PIPoint(sqrt(x*x + y*y), isDeg ? angleDeg() : angleRad());} //! static PIPoint fromPolar(const PIPoint & p) {return PIPoint(p.y * cos(p.x), p.y * sin(p.x));} //! void operator +=(const PIPoint & p) {translate(p);} //! PIPoint operator +(const PIPoint & p) {return PIPoint(x + p.x, y + p.y);} //! PIPoint operator +(const Type & p) {return PIPoint(x + p, y + p);} //! PIPoint operator -(const PIPoint & p) {return PIPoint(x - p.x, y - p.y);} //! PIPoint operator -(const Type & p) {return PIPoint(x - p, y - p);} //! PIPoint operator -() {return PIPoint(-x, -y);} //! bool operator ==(const PIPoint & p) const {return (x == p.x && y == p.y);} //! bool operator !=(const PIPoint & p) const {return (x != p.x || y != p.y);} }; 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