# Geometry basic

unknown
c_cpp
2 years ago
1.6 kB
1
Indexable
Never
```template <class T> int sgn(T x) { return (x > 0) - (x < 0); }
template <class T> struct Point {
T x, y;
Point() : x(0), y(0) {}
Point(const T& x, const T& y) : x(x), y(y) {}

friend std::ostream& operator<<(std::ostream& out, const Point& p) { return out << "(" << p.x << "," << p.y << ")"; }
friend std::istream& operator>>(std::istream& in, Point& p) { return in >> p.x >> p.y; }

friend bool operator==(const Point& a, const Point& b) { return tie(a.x, a.y) == tie(b.x, b.y); }
friend bool operator!=(const Point& a, const Point& b) { return tie(a.x, a.y) != tie(b.x, b.y); }
friend bool operator<(const Point& a, const Point& b) { return tie(a.x, a.y) < tie(b.x, b.y); }

Point operator+(const Point& p) const { return Point(x + p.x, y + p.y); }
Point operator-(const Point& p) const { return Point(x - p.x, y - p.y); }
Point operator*(const T& d) const { return Point(x * d, y * d); }
Point operator/(const T& d) const { return Point(x / d, y / d); }

T dot(const Point& p) const { return x * p.x + y * p.y; }
T cross(const Point& p) const { return x * p.y - y  *p.x; }
T cross(const Point& a, const Point& b) const { return (a - *this).cross(b - *this); }
T dist2() const { return x * x + y * y; }
double dist() const { return sqrt((double)dist2()); }
double angle() const { return atan2(y, x); } // [-pi, pi] to x-axis

Point unit() const { return *this / dist(); } // unit vector
Point perp() const { return P(-y, x); } // rotates +90 degrees
Point normal() const { return perp().unit(); }
};```