diff options
Diffstat (limited to 'Build/source/utils/lcdf-typetools/include/lcdf/point.hh')
-rw-r--r-- | Build/source/utils/lcdf-typetools/include/lcdf/point.hh | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/point.hh b/Build/source/utils/lcdf-typetools/include/lcdf/point.hh new file mode 100644 index 00000000000..a4d2495cac2 --- /dev/null +++ b/Build/source/utils/lcdf-typetools/include/lcdf/point.hh @@ -0,0 +1,185 @@ +// -*- related-file-name: "../../liblcdf/point.cc" -*- +#ifndef LCDF_POINT_HH +#define LCDF_POINT_HH +#include <math.h> + +struct Point { + + double x; + double y; + + Point() { } + Point(double xx, double yy) : x(xx), y(yy) { } + // Point(const Point &) use compiler default + Point(const Point &p, double dx, double dy) : x(p.x + dx), y(p.y + dy) { } + // ~Point() use compiler default + + inline double squared_length() const throw (); + inline double length() const throw (); + inline double magnitude() const throw (); + static inline double distance(const Point &, const Point &) throw (); + static inline double dot(const Point &, const Point &) throw (); + static Point midpoint(const Point &, const Point &) throw (); + + inline double angle() const throw (); + + void shift(double dx, double dy) { x += dx; y += dy; } + + inline Point shifted(double dx, double dy) const throw (); + Point rotated(double) const throw (); + inline Point normal() const throw (); + + bool on_line(const Point &, const Point &, double) const throw (); + bool on_segment(const Point &, const Point &, double) const throw (); + + inline Point &operator+=(const Point &) throw (); + inline Point &operator-=(const Point &) throw (); + inline Point &operator*=(double) throw (); + inline Point &operator/=(double) throw (); + + // Point operator+(Point, const Point &); + // Point operator-(Point, const Point &); + // Point operator*(Point, double); + // Point operator/(Point, double); + // Point operator-(const Point &); + + // bool operator==(const Point &, const Point &); + // bool operator!=(const Point &, const Point &); + +}; + +inline double +Point::squared_length() const throw () +{ + return x*x + y*y; +} + +inline double +Point::length() const throw () +{ + return sqrt(x*x + y*y); +} + +inline double +Point::magnitude() const throw () +{ + return length(); +} + +inline double +Point::angle() const throw () +{ + return atan2(y, x); +} + +inline Point +Point::shifted(double dx, double dy) const throw () +{ + return Point(x + dx, y + dy); +} + +inline Point +Point::normal() const throw () +{ + double l = length(); + return (l ? Point(x/l, y/l) : *this); +} + +inline Point & +Point::operator+=(const Point &p) throw () +{ + x += p.x; + y += p.y; + return *this; +} + +inline Point & +Point::operator-=(const Point &p) throw () +{ + x -= p.x; + y -= p.y; + return *this; +} + +inline Point & +Point::operator*=(double d) throw () +{ + x *= d; + y *= d; + return *this; +} + +inline Point & +Point::operator/=(double d) throw () +{ + x /= d; + y /= d; + return *this; +} + +inline bool +operator==(const Point &a, const Point &b) throw () +{ + return a.x == b.x && a.y == b.y; +} + +inline bool +operator!=(const Point &a, const Point &b) throw () +{ + return a.x != b.x || a.y != b.y; +} + +inline Point +operator+(Point a, const Point &b) throw () +{ + a += b; + return a; +} + +inline Point +operator-(Point a, const Point &b) throw () +{ + a -= b; + return a; +} + +inline Point +operator-(const Point &a) throw () +{ + return Point(-a.x, -a.y); +} + +inline Point +operator*(Point a, double scale) throw () +{ + a *= scale; + return a; +} + +inline Point +operator*(double scale, Point a) throw () +{ + a *= scale; + return a; +} + +inline Point +operator/(Point a, double scale) throw () +{ + a /= scale; + return a; +} + +inline double +Point::distance(const Point &a, const Point &b) throw () +{ + return (a - b).length(); +} + +inline double +Point::dot(const Point &a, const Point &b) throw () +{ + return a.x*b.x + a.y*b.y; +} + +#endif |