来自LRJ
类似卷包裹算法
把每条边拆成两条半边(有向边),u->v和v->u,并且只取每条有向边的左边的区域
思路就是从每个点出发(包括新产生的交点),沿着逆时针转的最多的一条边作为下一条边,直到回到起点,其左边围成的区域就是其中一个多边形
遍历的方向如下:
最外面的那个为无限面
求沿着逆时针转的最多的一条边作为下一条边方法就是取反向边顺时针转动的第一条,这样子更加的方便
// 平面直线图(PSGL)实现
struct PSLG {
int n, m, face_cnt;
double x[maxn], y[maxn];
vector<Edge> edges;
vector<int> G[maxn];
int vis[maxn*2]; // 每条边是否已经访问过
int left[maxn*2]; // 左面的编号(该边在哪个面内)
int prev[maxn*2]; // 相同起点的上一条边(即顺时针旋转碰到的下一条边)的编号
vector<Polygon> faces;
double area[maxn]; // 每个polygon的面积
void init(int