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

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

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

< > < > < > < >

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

并且生成的多边形很奇怪或者有多边形几个洞

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

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

这是一个例子: 在此处输入图像描述

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

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

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

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

<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> Split(List points) { List> polygons = new List>(); GeoData firstPoint = null; List currentPolygon; foreach(var point in points) { if(firstPoint == null) { firstPoint = point; currentPolygon = new List(); currentPolygon.Add(point); } else { currentPolygon.Add(point); if(point == firstPoint) { firstPoint = null; polygons.Add(currentPolygon); } } } return polygons; } 

用法:

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