我得到一个直线多边形,其坐标给出 请向我建议一个逆时针排序的解决方案,这样就可以形成一条封闭的线。
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);
}
但这不起作用。
请提供解决方案。
答案 0 :(得分:6)
考虑以下多边形:
首先,按y坐标排序顶点。在y坐标相等的组中,顶点按x坐标排序:
如果没有退化顶点,每个组中将始终存在偶数个顶点。边缘将永远交替。因此,在0-1之间存在边缘,1-2之间没有边缘,2-3之间没有边缘,没有边缘,边缘等。
存储每个顶点的关联边。例如。在地图或适当的结构中。
对垂直边缘执行相同操作(首先按x坐标排序,在组中按y坐标排序)。
然后你有多边形的所有边。每个顶点现在应该有2个相关边。选择一个顶点并从边缘到边缘。这将为您提供折线。如果您发现该线是顺时针方向,只需还原顺序,您将获得一条ccw折线。