1+ // geometry
2+ // https://youtu.be/UWbGRhF3Ozw?t=9564
3+ const double eps = 1e-9 ;
4+ struct V {
5+ double x, y;
6+ V (double x=0 , double y=0 ): x(x), y(y) {}
7+ V& operator +=(const V& v) { x += v.x ; y += v.y ; return *this ;}
8+ V operator +(const V& v) const { return V (*this ) += v;}
9+ V& operator -=(const V& v) { x -= v.x ; y -= v.y ; return *this ;}
10+ V operator -(const V& v) const { return V (*this ) -= v;}
11+ V& operator *=(double s) { x *= s; y *= s; return *this ;}
12+ V operator *(double s) const { return V (*this ) *= s;}
13+ V& operator /=(double s) { x /= s; y /= s; return *this ;}
14+ V operator /(double s) const { return V (*this ) /= s;}
15+ double dot (const V& v) const { return x*v.x + y*v.y ;}
16+ double cross (const V& v) const { return x*v.y - v.x *y;}
17+ double norm2 () const { return x*x + y*y;}
18+ double norm () const { return sqrt (norm2 ());}
19+
20+ int ort () const { // orthant
21+ if (abs (x) < eps && abs (y) < eps) return 0 ;
22+ if (y > 0 ) return x>0 ? 1 : 2 ;
23+ else return x>0 ? 4 : 3 ;
24+ }
25+ bool operator <(const V& v) const {
26+ int o = ort (), vo = v.ort ();
27+ if (o != vo) return o < vo;
28+ return cross (v) > 0 ;
29+ }
30+ };
31+ istream& operator >>(istream& is, V& v) {
32+ is >> v.x >> v.y ; return is;
33+ }
34+ ostream& operator <<(ostream& os, const V& v) {
35+ os<<" (" <<v.x <<" ," <<v.y <<" )" ; return os;
36+ }
0 commit comments