summaryrefslogtreecommitdiff
path: root/dviware/dvisvgm/src/Pair.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/dvisvgm/src/Pair.hpp')
-rw-r--r--dviware/dvisvgm/src/Pair.hpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/dviware/dvisvgm/src/Pair.hpp b/dviware/dvisvgm/src/Pair.hpp
index 5804a2b467..5dd7c68a93 100644
--- a/dviware/dvisvgm/src/Pair.hpp
+++ b/dviware/dvisvgm/src/Pair.hpp
@@ -26,17 +26,21 @@
#include "macros.hpp"
template <typename T>
-class Pair
-{
+class Pair {
public:
explicit Pair (T x=0, T y=0) : _x(x), _y(y) {}
+ template <typename U> Pair (const Pair<U> &p) : _x(U(p.x())), _y(U(p.y())) {}
+ Pair (const Pair &p) =default;
+ Pair (Pair &&p) =default;
+ Pair& operator = (const Pair &p) =default;
+ Pair& operator = (Pair &&p) =default;
Pair operator += (const Pair &p) {_x += p._x; _y += p._y; return *this;}
Pair operator -= (const Pair &p) {_x -= p._x; _y -= p._y; return *this;}
Pair operator *= (T c) {_x *= c; _y *= c; return *this;}
Pair operator /= (T c) {_x /= c; _y /= c; return *this;}
Pair operator - () const {return Pair(-_x, -_y);}
Pair ortho () const {return Pair(-_y, _x);}
- double length () const {return std::sqrt(_x*_x + _y*_y);}
+ double length () const {return std::hypot(_x, _y);}
bool operator == (const Pair &p) const {return _x == p._x && _y == p._y;}
bool operator != (const Pair &p) const {return _x != p._x || _y != p._y;}
T x () const {return _x;}
@@ -54,6 +58,18 @@ inline Pair<T> abs (const Pair<T> &p) {
return Pair<T>(std::abs(p.x()), std::abs(p.y()));
}
+/** Returns the dot product of two 2D vectors. */
+template <typename T>
+inline T dot (const Pair<T> &p1, const Pair<T> &p2) {
+ return p1.x()*p1.y() + p1.y()*p2.y();
+}
+
+/** Returns the determinant of two 2D vectors. */
+template <typename T>
+inline T det (const Pair<T> &p1, const Pair<T> &p2) {
+ return p1.x()*p2.y() - p1.y()*p2.x();
+}
+
struct Pair32 : public Pair<int32_t> {
explicit Pair32 (int32_t x=0, int32_t y=0) : Pair<int32_t>(x, y) {}
explicit Pair32 (double x, double y) : Pair<int32_t>(lround(x), lround(y)) {}
@@ -62,6 +78,10 @@ struct Pair32 : public Pair<int32_t> {
typedef Pair<double> DPair;
+inline DPair round (const DPair &p) {
+ return DPair(std::lround(p.x()), std::lround(p.y()));
+}
+
template <typename T>
IMPLEMENT_ARITHMETIC_OPERATOR(Pair<T>, +)