C# 从多个多边形的并集中构造多边形

C# 从多个多边形的并集中构造多边形,c#,algorithm,geometry,computational-geometry,C#,Algorithm,Geometry,Computational Geometry,假设我有很多多边形,那么从所有这些多边形的并集中构造多边形(可能有洞)的最佳算法是什么 就我而言,你可以把多边形的每一块想象成一块拼图,当你完成它们时,你会得到一张漂亮的图片。但问题是,一小部分(比如说那是蛮力)你在做什么。蛮力更好的方法是分支和绑定。但这仍然是可怕的规模 下一步是尝试算法(Tabu Search,Maulink Maulink……),或者只需重用一个框架(比如开源、Java),实现它。 < p>你需要一个多边形裁剪库——我将用自己的库来代替它,因为它是用C语言(和C++和Del

假设我有很多多边形,那么从所有这些多边形的并集中构造多边形(可能有洞)的最佳算法是什么


就我而言,你可以把多边形的每一块想象成一块拼图,当你完成它们时,你会得到一张漂亮的图片。但问题是,一小部分(比如说那是蛮力)你在做什么。蛮力更好的方法是分支和绑定。但这仍然是可怕的规模


下一步是尝试算法(Tabu Search,Maulink Maulink……),或者只需重用一个框架(比如开源、Java),实现它。

< p>你需要一个多边形裁剪库——我将用自己的库来代替它,因为它是用C语言(和C++和Delphi)编写的,它是开源的免费软件,它会按你想要的java做。 我天真的方法是取两个多边形,合并它们,然后取另一个多边形,用两个多边形的合并来合并它,然后重复这个过程,直到每一块都合并

这将是一个非常低效的方法。一个更好的方法是在一次操作中“联合”他们所有人

using ClipperLib;
using Polygon = List<IntPoint>;
using Polygons = List<List<IntPoint>>;
...

//precondition: all your polygons have the same orientation 
//(ie either clockwise or counter clockwise)
Polygons polys = new Polygons(PolyCnt);
for (int i = 0; i < PolyCnt; i++)
    polys.Add(loadPolyFromFile(String.Format("poly{0}.txt", i +1)));

Polygons solution = new Polygons();
Clipper c = new Clipper();
c.AddPolygons(polys, PolyType.ptSubject);
c.Execute(ClipType.ctUnion, solution, 
    PolyFillType.pftNonZero, PolyFillType.pftNonZero);

//code to display solution here.
使用ClipperLib;
使用多边形=列表;
使用多边形=列表;
...
//前提条件:所有多边形都具有相同的方向
//(即顺时针或逆时针)
多边形多边形=新多边形(多边形);
对于(int i=0;i
关于元启发式算法的帮助有什么建议吗?我看到了wiki,但它很少涉及我上面描述的问题。元启发式是关于“移动东西”,所以在您的例子中是“移动多边形;或添加或删除多边形”。请看一看禁忌搜索,这很容易实现。如果您只考虑计算多边形的并集,而不是解决潜在问题的其他解决方案,那么正确的方法是一次并集所有多边形,而不是成对进行。例如,计算并集的扫掠线算法可以适合于将整组而不是一对组合在一起。下面提到的快速答案听起来不错。OP还问了一个关于数学的问题,我认为答案更好(更具体)我在这里发布了关于同一个问题的答案:你的
前提条件
评论刚刚解决了一个我整个上午都在努力解决的问题。我得到的是一个不同形式的联合结果,我不知道我到底做错了什么。结果证明我是在一个逆时针多边形上写的,带有一组顺时针多边形ygons。我肯定这在你的文档中的某个地方,但我错过了它。你的文档总体上相当可靠,做得很好。到目前为止,我对移植的go.clipper库非常满意。如果能为这个库的C#版本提供一个NuGet包,那就太好了