gpt4 book ai didi

c# - 合并接触的多边形给出错误的结果

转载 作者:太空狗 更新时间:2023-10-29 20:41:28 25 4
gpt4 key购买 nike

我正在尝试编写一段代码,给定多边形列表(定义为 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);

现在这两个方法很容易将多边形合并在一起,但是它们有点过分,因为任何多边形开放空间都被忽略,开放区域只是简单地组合成一个多边形,这意味着像这样: Sheer horror as a two polygons that are not touching are merged into a single square devoid of any meaning or life

发生了。现在这显然是错误的,因为这两个多边形不会相互接触。两种方法都会出现相同的结果。结果将与输入相同。知道如何解决这个问题吗?解决方案不必使用裁剪器库(我没有与它结婚)但我确实需要使用由点列表定义的多边形的东西 input is a List> where an Intpoint is just a struct containing a x和一个y。

编辑我注意到当另一个多边形内部没有多边形时也会出现这个问题,所以解决方案总是“填充”编辑编辑:这也是输入的示例

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

此描述的输入是一个切有孔的正方形。

最佳答案

在执行之前,需要将 PolyType.ptSubject(您的代码中缺少)和 PolyType.ptClip 添加到您的 Clipper。您还需要选择将产生您想要的结果的 ClipType,如下所示:

    private void Form1_Paint(object sender, PaintEventArgs e)
{
clip = new List<List<IntPoint>>();
clip.Add(pol2);

input = new List<List<IntPoint>>();
input.Add(pol1);

output = new List<List<IntPoint>>();

Clipper c = new Clipper();
c.AddPaths(input, PolyType.ptSubject, true);
c.AddPaths(clip, PolyType.ptClip, true);
c.Execute(clipType, output);

DrawPolygon(output, e.Graphics, Pens.Red);
}

异或:

enter image description here

联盟:

enter image description here

十字路口:

enter image description here

区别:pol1 - pol2

enter image description here

区别:pol2 - pol1

enter image description here

关于c# - 合并接触的多边形给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34000482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com