1+ #include < bits/stdc++.h>
2+ using namespace std ;
3+ #define sc (x ) scanf(" %lld" , &x)
4+ typedef long long ll;
5+ #define EPS (1e-10 )
6+ #define equals (a, b ) (fabs((a) - (b)) < EPS )
7+ class Point
8+ {
9+ public:
10+ double x, y;
11+ Point (double x = 0 , double y = 0 ) : x(x), y(y) {}
12+ Point operator +(const Point &p) const { return Point (x + p.x , y + p.y ); }
13+ Point operator -(const Point &p) const { return Point (x - p.x , y - +p.y ); }
14+ Point operator *(const double &a) const { return Point (x * a, y * a); }
15+ Point operator /(const double &a) const { return Point (x / a, y / a); }
16+ double norm () const { return x * x + y * y; }
17+ double abs () const { return sqrt (norm ()); }
18+ bool operator <(const Point &p) const
19+ {
20+ return x != p.x ? x < p.x : y < p.y ;
21+ }
22+ bool operator ==(const Point &p) const
23+ {
24+ return fabs (x - p.x ) < EPS && fabs (y - p.y ) < EPS ;
25+ }
26+ };
27+ typedef Point Vector;
28+ double dot (const Point &a, const Point &b)
29+ {
30+ return a.x * b.x + a.y * b.y ;
31+ }
32+ double cross (const Point &a, const Point &b)
33+ {
34+ return a.x * b.y - a.y * b.x ;
35+ }
36+ bool isParallel (const Vector &a, const Vector &b)
37+ {
38+ return equals (cross (a, b), 0.0 );
39+ }
40+ bool isOrthogonal (const Vector &a, const Vector &b)
41+ {
42+ return equals (dot (a, b), 0.0 );
43+ }
44+ double getDistance (const Point &a, const Point &b)
45+ {
46+ return (a - b).abs ();
47+ }
48+ // 极坐标互换
49+ double arg (const Vector &p) { return atan2 (p.y , p.x ); }
50+ Vector polar (const double &a, const double &r)
51+ {
52+ return Point (cos (r) * a, sin (r) * a);
53+ }
54+ double dis_lp (const Point &a, const Point &b, const Point &p)
55+ {
56+ return abs (cross (b - a, p - a)) / (b - a).abs ();
57+ }
58+ double dis_sp (const Point &a, const Point &b, const Point &p)
59+ {
60+ if (dot (b - a, p - a) < 0.0 )
61+ {
62+ return (p - a).abs ();
63+ }
64+ if (dot (a - b, p - b) < 0.0 )
65+ {
66+ return (p - b).abs ();
67+ }
68+ return dis_lp (a, b, p);
69+ }
70+ // bool isIntersect(const Point &a, const Point &b, const Point &c, const Point &d)
71+ // {
72+ // return cross(c - a, d - a) * cross(c - b, d - b) <= 0.0 && cross(a - c, b - c) * cross(a - d, b - d) <= 0.0;
73+ // } // 条件: AB,CD不在一条直线上
74+ ll f (const Point &a, const Point &b)
75+ {
76+ if (cross (a, b) > EPS )
77+ {
78+ return 1 ; // 逆时针
79+ }
80+ if (cross (a, b) < -EPS )
81+ {
82+ return -1 ; // 顺时针
83+ }
84+ if (dot (a, b) < -EPS )
85+ {
86+ return 2 ; // P在AB左方
87+ }
88+ if (a.abs () < b.abs ())
89+ {
90+ return -2 ; // P在AB右方
91+ }
92+ return 0 ; // P在AB内部
93+ }
94+ bool isIntersect (const Point &a, const Point &b, const Point &c, const Point &d)
95+ {
96+ return f (c - a, d - a) * f (c - b, d - b) <= 0 && f (a - c, b - c) * f (a - d, b - d) <= 0 ;
97+ }
98+ Point intersect (const Point &a, const Point &b, const Point &c, const Point &d)
99+ {
100+ return c + (d - c) * (cross (a - c, b - a) / cross (d - c, b - a));
101+ }
102+ Point project (const Point &a, const Point &b, const Point &p)
103+ {
104+ return a + (b - a) * (dot (b - a, p - a) / (b - a).norm ());
105+ }
106+ signed main ()
107+ {
108+
109+ return 0 ;
110+ }
0 commit comments