我有一个成对描述多边形的点列表,如下所示:
<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(points) 绘制这些多边形的天真做法是行不通的。
这是在 c# 中,输入实际上是一个 List<GeoData>
其中 GeoData
包含 2 个点(和其他一些 misq 数据)。对于输出,我正在考虑制作一个列表和一个列表>,其中第一组点是外线,第二组是孔,这行得通吗?除了绘制之外,我确实需要对多边形进行一些额外的计算,但我认为使用特殊的孔列表最简单。
左边是我目前得到的,右边是输入。
最佳答案
从您的示例中,我看到您绘制了一个单个 多边形。您应该为每个单独的多边形多次调用方法绘制多边形 (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<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);
}
关于c# - 将壁面列表转换为连贯多边形的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34263601/