将壁序列表转换为相干多边形的算法
我有一对成对点描述多边形的点列表,如下所示:
是正方形。 请注意,每对点描述一条线,因此我们的方块由线组成
< > < > < > < >
然而,我必须绘制这些多边形,当所讨论的点都正确有序并且没有孔时,这些多边形可以正常工作。 不幸的是,当输入类似时,这有时会出错
并且生成的多边形很奇怪或者有多边形几个洞
在这些情况下,使用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); }