我正在尝试编写一段代码,给出一个多边形列表(定义为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);
现在这两个都很容易将多边形合并在一起,但它们有点过于粗糙,因为任何多边形开放空间都会被忽略,而开放区域只是组合成一个多边形,这意味着:
发生.现在这显然是错误的,因为这两个多边形不相互接触.两种方法都会出现相同的结果.结果与输入相同.知道如何解决这个问题吗? sollution不必使用限幅器库(我没有与它结合)但我确实需要使用由点列表定义的多边形的东西输入是List>其中Intpoint只是一个包含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,true); c.Execute(clipType,output); Drawpolygon(output,e.Graphics,Pens.Red); }
XOR:
联盟:
路口:
差异:pol1 – pol2
差异:pol2 – pol1
原文地址:https://www.jb51.cc/csharp/99803.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。