-
Notifications
You must be signed in to change notification settings - Fork 12
/
basic_elements.cpp
121 lines (106 loc) · 4.06 KB
/
basic_elements.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
//------------------------------//
// 基本要素 (点, 線分, 円)
//------------------------------//
// basic settings
using DD = long double;
const long double PI = acosl(-1.0L);
constexpr long double INF = 1LL<<60; // to be set appropriately
constexpr long double EPS = 1e-10; // to be set appropriately
long double torad(int deg) {return (long double)(deg) * PI / 180;}
long double todeg(long double ang) {return ang * 180 / PI;}
// Point or Vector
struct Point {
DD x, y;
// constructor
constexpr Point() : x(0), y(0) {}
constexpr Point(DD x, DD y) : x(x), y(y) {}
// various functions
constexpr Point conj() const {return Point(x, -y);}
constexpr DD dot(const Point &r) const {return x * r.x + y * r.y;}
constexpr DD cross(const Point &r) const {return x * r.y - y * r.x;}
constexpr DD norm() const {return dot(*this);}
constexpr long double abs() const {return sqrt(norm());}
constexpr long double amp() const {
long double res = atan2(y, x);
if (res < 0) res += PI*2;
return res;
}
constexpr bool eq(const Point &r) const {return (*this - r).abs() <= EPS;}
constexpr Point rot90() const {return Point(-y, x);}
constexpr Point rot(long double ang) const {
return Point(cos(ang) * x - sin(ang) * y, sin(ang) * x + cos(ang) * y);
}
// arithmetic operators
constexpr Point operator - () const {return Point(-x, -y);}
constexpr Point operator + (const Point &r) const {return Point(*this) += r;}
constexpr Point operator - (const Point &r) const {return Point(*this) -= r;}
constexpr Point operator * (const Point &r) const {return Point(*this) *= r;}
constexpr Point operator / (const Point &r) const {return Point(*this) /= r;}
constexpr Point operator * (DD r) const {return Point(*this) *= r;}
constexpr Point operator / (DD r) const {return Point(*this) /= r;}
constexpr Point& operator += (const Point &r) {
x += r.x, y += r.y;
return *this;
}
constexpr Point& operator -= (const Point &r) {
x -= r.x, y -= r.y;
return *this;
}
constexpr Point& operator *= (const Point &r) {
DD tx = x, ty = y;
x = tx * r.x - ty * r.y;
y = tx * r.y + ty * r.x;
return *this;
}
constexpr Point& operator /= (const Point &r) {
return *this *= r.conj() / r.norm();
}
constexpr Point& operator *= (DD r) {
x *= r, y *= r;
return *this;
}
constexpr Point& operator /= (DD r) {
x /= r, y /= r;
return *this;
}
// friend functions
friend ostream& operator << (ostream &s, const Point &p) {
return s << '(' << p.x << ", " << p.y << ')';
}
friend constexpr Point conj(const Point &p) {return p.conj();}
friend constexpr DD dot(const Point &p, const Point &q) {return p.dot(q);}
friend constexpr DD cross(const Point &p, const Point &q) {return p.cross(q);}
friend constexpr DD norm(const Point &p) {return p.norm();}
friend constexpr long double abs(const Point &p) {return p.abs();}
friend constexpr long double amp(const Point &p) {return p.amp();}
friend constexpr bool eq(const Point &p, const Point &q) {return p.eq(q);}
friend constexpr Point rot90(const Point &p) {return p.rot90();}
friend constexpr Point rot(const Point &p, long long ang) {return p.rot(ang);}
};
// Line
struct Line : vector<Point> {
Line(Point a = Point(0.0, 0.0), Point b = Point(0.0, 0.0)) {
this->push_back(a);
this->push_back(b);
}
friend ostream& operator << (ostream &s, const Line &l) {
return s << '{' << l[0] << ", " << l[1] << '}';
}
};
// Circle
struct Circle : Point {
DD r;
Circle(Point p = Point(0.0, 0.0), DD r = 0.0) : Point(p), r(r) {}
friend ostream& operator << (ostream &s, const Circle &c) {
return s << '(' << c.x << ", " << c.y << ", " << c.r << ')';
}
};
//------------------------------//
// Examples
//------------------------------//
int main() {
}