c# - 将壁面列表转换为连贯多边形的算法

标签 c# algorithm geometry 2d polygon

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

<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 数据)。对于输出,我正在考虑制作一个列表和一个列表>,其中第一组点是外线,第二组是孔,这行得通吗?除了绘制之外,我确实需要对多边形进行一些额外的计算,但我认为使用特殊的孔列表最简单。

举个例子: enter image description here

左边是我目前得到的,右边是输入。

最佳答案

从您的示例中,我看到您绘制了一个单个 多边形。您应该为每个单独的多边形多次调用方法绘制多边形 (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/

相关文章:

c# - 使用 Azure 门户将 .nupkg 文件上传到我的 Azure 函数

c# - XAML WinRT - 自定义样式的工厂模式

algorithm - 如何实现一个特性推荐引擎?

java - 将图形对象旋转 360 度

geometry - 几何中位数 : Is there a Java implementation for Weiszfeld's Algorithm?

c# - AppFabric DataCache 按键获取值?

c# - SizeToContent 不尊重 SharedSizeGroups

java - 地形/山地算法未按预期工作

c - X 与范围 L 到 R 中的每个数组元素的 XOR 的总和

python - 3D 中的射线和正方形/矩形相交