-3

我得到一个直线多边形,它的坐标是给定的。
请向我建议一个逆时针排序的解决方案,这样可以形成一条闭合线。

bool mycomparator(Point p1,Point p2){

    return ((p1.x*p2.y-p2.x*p1.y)>0);

}

void sort_anticlockwise(vector<Point> v){

    sort(v.begin(),v.end(),mycomparator);

}

但这不起作用。
请提供解决方案。

4

1 回答 1

6

考虑以下多边形:

多边形

首先,按 y 坐标对顶点进行排序。在相等的 y 坐标组中,按 x 坐标对顶点进行排序:

按 y 和 x 坐标排序

如果没有退化顶点,则每组中的顶点数总是偶数。边缘将始终交替。所以0-1之间有边,1-2之间没有边,2-3之间有边,没有边,边等。

添加边

存储每个顶点的关联边。例如在地图或适当的结构中。

对垂直边缘执行相同的操作(首先按 x 坐标排序,在组中按 y 坐标排序)。

然后你就有了多边形的所有边。每个顶点现在应该有 2 个关联的边。选择一个顶点并从边到边。这将为您提供折线。如果你发现这条线是顺时针方向的,只需恢复顺序,你就会得到一条 ccw 折线。

于 2013-07-25T16:37:41.697 回答