我正在尝试编写一段代码,它给出一个多边形列表(定义为 IntPoints 列表的列表)检查它们中的任何一个是否接触,如果是,则将它们合并为一个多边形。为了做到这一点,我已经尝试了以下两种方法:
List<List<IntPoint>> output=new List<List<IntPoint>>();
output = Clipper.SimplifyPolygons(input,PolyFillType.pftPositive);
和
Clipper c = new Clipper();
c.AddPaths(input, PolyType.ptClip, true);
c.Execute(ClipType.ctUnion, output);
现在这两个都很容易将多边形合并在一起,但是它们有点过分,因为任何多边形的开放空间都被忽略了,开放区域被简单地组合成一个多边形,这意味着像这样:
发生。现在这显然是错误的,因为这两个多边形不相互接触。两种方法都会出现相同的结果。结果将与输入相同。知道如何解决这个问题吗?解决方案不必使用裁剪器库(我没有嫁给它),但我确实需要使用由点列表定义的多边形的东西输入是 List> 其中 Intpoint 只是一个包含 x 的结构和一个。
编辑我注意到当另一个多边形内部没有多边形时也会出现此问题,因此解决方案始终是“填充”编辑编辑:这里也是输入可能是什么样的示例
input[0][0]
{ClipperLib.IntPoint}
X: -724
Y: -472
input[0][1]
{ClipperLib.IntPoint}
X: 428
Y: -472
input[0][2]
{ClipperLib.IntPoint}
X: 428
Y: -472
input[0][3]
{ClipperLib.IntPoint}
X: 428
Y: 632
input[0][4]
{ClipperLib.IntPoint}
X: 428
Y: 632
input[0][5]
{ClipperLib.IntPoint}
X: -724
Y: 632
input[0][6]
{ClipperLib.IntPoint}
X: -724
Y: 632
input[0][7]
{ClipperLib.IntPoint}
X: -724
Y: -472
input[0][8]
{ClipperLib.IntPoint}
X: -88
Y: -218
input[0][9]
{ClipperLib.IntPoint}
X: -107
Y: -218
input[0][10]
{ClipperLib.IntPoint}
X: -107
Y: -218
input[0][11]
{ClipperLib.IntPoint}
X: -107
Y: -209
input[0][12]
{ClipperLib.IntPoint}
X: -107
Y: -209
input[0][13]
{ClipperLib.IntPoint}
X: -320
Y: -172
input[0][14]
{ClipperLib.IntPoint}
X: -320
Y: -172
input[0][15]
{ClipperLib.IntPoint}
X: -320
Y: 132
input[0][16]
{ClipperLib.IntPoint}
X: -320
Y: 132
input[0][17]
{ClipperLib.IntPoint}
X: -88
Y: 173
input[0][18]
{ClipperLib.IntPoint}
X: -88
Y: 173
input[0][19]
{ClipperLib.IntPoint}
X: -88
Y: -201
input[0][20]
{ClipperLib.IntPoint}
X: -88
Y: -201
input[0][21]
{ClipperLib.IntPoint}
X: -88
Y: -218
这个描述的输入是一个正方形,里面有一个洞。