如何从一组无序点绘制多边形

时间:2013-01-18 03:47:33

标签: wpf sorting draw polygon

目前,我正在使用凸包算法从随机放置的一组点中获取最外面的点。我打算做的是从凸包返回的点集中绘制一个多边形,但是当我尝试绘制多边形时,它看起来很奇怪。

enter image description here

我的问题是,如何订购点以便多边形正确绘制?

感谢。

编辑:

另外,我尝试使用orderby(...)进行排序。然后我(...)并且我似乎无法使其正常工作。

3 个答案:

答案 0 :(得分:5)

您是否尝试过礼品包装算法(http://en.wikipedia.org/wiki/Gift_wrapping_algorithm)?这应该以正确的顺序返回点。

答案 1 :(得分:2)

我遇到了一个问题,即生成一组随机点,包裹的高程向量需要一个基本轮廓。阅读@ user1149913提供的链接并找到gift-wrapping a hull的样本后,以下是我的实现示例:

  private static PointCollection CalculateContour (List<Point> points) {
     // locate lower-leftmost point
     int hull = 0;
     int i;
     for (i = 1 ; i < points.Count ; i++) {
        if (ComparePoint(points[i], points[hull])) {
           hull = i;
        }
     }

     // wrap contour
     var outIndices = new int[points.Count];
     int endPt;
     i = 0;
     do {
        outIndices[i++] = hull;
        endPt = 0;
        for (int j = 1 ; j < points.Count ; j++)
           if (hull == endPt || IsLeft(points[hull], points[endPt], points[j]))
              endPt = j;
        hull = endPt;
     } while (endPt != outIndices[0]);

     // build countour points
     var contourPoints = new PointCollection(points.Capacity);
     int results = i;
     for (i = 0 ; i < results ; i++)
        contourPoints.Add(points[outIndices[i]]);
     return contourPoints;
  }

答案 2 :(得分:0)

这不是完整的解决方案,而是正确方向的指南。我最近遇到了一个非常相似的问题,我发现了一条带答案(https://www.reddit.com/r/DnDBehindTheScreen/comments/8efeta/a_random_star_chart_generator/dxvlsyt/)的reddit帖子,建议使用Delaunay triangulation,这实际上返回的解决方案是在您的数据点内制作出所有可能的三角形。一旦有了所有可能的三角形(根据定义,您知道该三角形不会在任何重叠的线上产生),您就可以选择在连接的所有节点上使用哪些线来产生结果。

我当时在python上编码我的解决方案,幸运的是,在python上有很多科学库。我正在研究一个随机的星空图生成器,该生成器可以从这些恒星中提取星座。为了获得所有可能的三角形(并出于娱乐目的而绘制它们),在进入绘制实际星座图的算法之前,我要做的就是:

    # 2D array of the coordinates of every star generated randomly before
    points = list(points_dict.keys())
        
    from scipy.spatial import Delaunay
    tri = Delaunay(points)
    
    # Draw the debug constellation with the full array of lines
    debug_constellation = Constellation(quadrants = quadrants, name_display_style = config.constellation_name_display_style)
    for star in available_stars:
        debug_constellation.add_star(star)
    for triangle in tri.simplices:
        star_ids = []
        for index in triangle:
            star_ids.append(points_dict[points[index]].id)
        debug_constellation.draw_segment(star_ids, is_closed = True)

    # Code to generate the image follows below

您可以在此处查看完整的实现:fake_sky_chart_generator/fake_libs/constellation_algorithms/delaunay.py

这是结果:

enter image description here