构造多边形联合多边形

时间:2010-12-24 11:51:11

标签: c# algorithm geometry computational-geometry

假设我有很多多边形,构造多边形的最佳算法是什么 - 可能是所有这些多边形的并集孔?

出于我的目的,你可以想象每一块多边形作为拼图块,当你完成它们时,你会得到一张漂亮的图片。但问题是,缺少一小部分(比如说<5%)的拼图,你仍然需要尽可能完整地形成一幅画面;这是多边形(或多边形) - 可能有孔 - 我想形成。

我天真的方法是取两个多边形,合并它们,然后取另一个多边形,将它与两个多边形的并集联合起来,然后重复这个过程直到每个单元都结合在一起。然后我将遍历联合多边形列表并检查是否仍然可以组合一些多边形,并且我将重复此过程,直到获得满意的结果。

但这似乎是一种非常天真的方法。我只是想知道还有其他更好的算法吗?

2 个答案:

答案 0 :(得分:7)

你需要一个多边形裁剪库 - 我将插入我自己的Clipper库,因为它是用C#(和C ++和Delphi)编写的,它是开源免费软件,它会完全按照你的意愿行事。

  

我天真的方法是取两个多边形,合并它们,然后取另一个多边形,将它与两个多边形的并集联合起来,然后重复这个过程,直到每一个都是联合

这将是一种非常低效的方法。一个更好的方法是在一次操作中“联合”它们......

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.

答案 1 :(得分:1)

那是蛮力你在做什么。做暴力的更好方法是分支和束缚。但那仍然可怕地扩展。

下一步是尝试metaheuristic算法(禁忌搜索,模拟退火......)或者只是重用一个像Drools Planner(开源,java)这样的框架来实现它们。< / p>