【问题标题】:Sort Anticlockwise the points of rectilinear polygon逆时针排序直线多边形的点
【发布时间】:2013-07-25 15:21:07
【问题描述】:

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

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);

}

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

【问题讨论】:

  • 我不认为这是@JimMischel 指出的另一个问题的重复。在那个问题中,多边形是由顶点和边指定的,这里似乎只给出了顶点。
  • 转换为以多边形质心为原点的极坐标,然后按角度排序。
  • 如果多边形不是凸的,则按角度对直线多边形的点进行排序不一定会产生正确的线环。我的直觉是,为一组顶点找到一个简单的直线循环是 NP 难的。
  • 多边形轴对齐了吗?这样会容易很多。

标签: c++ algorithm sorting


【解决方案1】:

考虑以下多边形:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2014-05-23
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    相关资源
    最近更新 更多