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
|
#pragma once
// clang-format off
#define MSG_INFO "[INFO] "
#define MSG_WARN "[WARN] "
#define MSG_ERROR "[ERRO] "
// clang-format on
struct Pt {
int x{}, y{};
Pt operator+(Pt o) const { return { x + o.x, y + o.y }; }
Pt operator-(Pt o) const { return { x - o.x, y - o.y }; }
Pt operator*(int k) const { return { x * k, y * k }; }
Pt operator/(int k) const { return { x / k, y / k }; }
bool operator==(const Pt&) const = default;
};
// avoid including <algorithm>
#define MMIN(x, y) ((x) < (y) ? (x) : (y))
#define MMAX(x, y) ((x) > (y) ? (x) : (y))
inline Pt pt_min(Pt a, Pt b) {
return Pt{ MMIN(a.x, b.x), MMIN(a.y, b.y) };
}
inline Pt pt_max(Pt a, Pt b) {
return Pt{ MMAX(a.x, b.x), MMAX(a.y, b.y) };
}
#undef MMIN
#undef MMAX
struct Rect {
Pt bl, tr;
Rect() {}
Rect(Pt tl, Pt br)
: bl(tl), tr(br) {}
Rect(int x0, int y0, int x1, int y1)
: bl(x0, y0), tr(x1, y1) {}
bool operator==(const Rect&) const = default;
};
inline Rect rect_union(Rect a, Rect b) {
return Rect(pt_min(a.bl, b.bl), pt_max(a.tr, b.tr));
}
inline Rect rect_union(Rect a, Pt b) {
return Rect(pt_min(a.bl, b), pt_max(a.tr, b));
}
|