原文链接:
http://www.myexception.cn/program/776883.html
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
| const double eps = 1e-8;
int sign(double d){
return d < -eps ? -1 : (d > eps);
}
// 多边形类
struct poly{
static const int N = 1005; // 点数的最大值
point ps[N + 5]; // 逆时针存储多边形的点,[0, pn - 1] 存储点
int pn; // 点数
poly() {
pn = 0;
}
// 加进一个点
void push(point tp){
ps[pn ++] = tp;
}
// 第k个位置
int trim(int k){
return (k + pn) % pn;
}
void clear() {
pn = 0;
}
};
// 多边形 org 的有向面积
double signArea(poly org){
int i, g;
double ans;
point* ps = org.ps;
for (ans = i = 0; i < org.pn; i ++) {
g = org.trim(i + 1);
ans += (ps[g].y * ps[i].x - ps[g].x * ps[i].y);
}
return ans / 2.0;
}
// 如果 org 的点是逆时针的,则调整为逆时针的
void makeAntclockwise(poly& org) {
if (sign(signArea(org)) < 0) {
reverse(org.ps, org.ps + org.pn);
}
}
|