首页 文章

将壁序列表转换为相干多边形的算法

提问于
浏览
0

我有一对成对点描述多边形的点列表,如下所示:

<0,0> <0,1> <0,1> <1,0> <1,0> <1,1> <1,1> <0,0>是正方形 . 请注意,每对点描述一条线,因此我们的方块由线组成

<< 0,0> <0,1 >> << 0,1> <1,0 >> << 1,0> <1,1 >> << 1,1> <0,0 >>

然而,我必须绘制这些多边形,当所讨论的点都正确有序并且没有孔时,这些多边形可以正常工作 . 不幸的是,当输入类似时,这有时会出错

<0,0> <0,1> <1,1> <0,0> <0,1> <1,0> <1,0> <1,1>并且得到的多边形很奇怪或者当有几个洞

<0,0> <0,2> <0,2> <2,0> <2,0> <2,2> <2,2> <0,0> <1,1> <1,1.5> <1,1.5> <1.5,1.5> <1.5,1.5> <1,1>

在这些情况下,使用drawpoly(点)绘制这些多边形的初始事情是行不通的 .

这是在c#中,输入实际上是 List<GeoData> ,其中 GeoData 包含2个点(以及一些其他misq数据) . 对于输出,我正在考虑制作一个List和一个List>,其中第一组点是外线,第二个列是孔,这会起作用吗?我确实需要对多边形进行一些额外的计算,然后只绘制,但我认为使用特殊的孔列表最简单 .

这是一个例子:
enter image description here

左边是我目前右边的输入 .

1 回答

  • 1

    从您的示例中,我看到您绘制了一个 single 多边形 . 您应该为每个单独的多边形多次调用方法draw polygon( drawpoly(points) ) .

    我认为更容易画出洞而不是墙,尊重原则KISS .

    为此,您可以将要绘制的多边形(孔)存储在列表中 . 如果我们对数据进行分析,我们会看到 bolded 数据显示了多边形的开始和结束 .

    <0,0> <0,2> <0,2> <2,0> <2,0> <2,2> <2,2> <0,0> <1,1> <1,1.5> <1,1.5> <1.5,1.5> <1.5 ,1.5> <1,1>

    我们在代码中表示这一点,如下所示:

    public List<List<GeoData>> Split(List<GeoData> points)
    {
        List<List<GeoData>> polygons = new List<List<GeoData>>();
        GeoData firstPoint = null;
        List<GeoData> currentPolygon;
    
        foreach(var point in points)
        {
            if(firstPoint == null)
            {
                firstPoint = point;
                currentPolygon = new List<GeoData>();
                currentPolygon.Add(point);
            }
            else
            {
                 currentPolygon.Add(point);
                 if(point == firstPoint)
                 {
                      firstPoint = null;
                      polygons.Add(currentPolygon);
                 }
            }
        }
        return polygons;
    }
    

    用法:

    List<List<GeoData>> polygons = Split(points);
    
    foreach(var polygon in polygons) 
    {
        drawpoly(polygon);
    }
    

相关问题