我正在尝试编写一段代码,该代码给出了多边形列表(定义为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&gt;其中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
此描述的输入是一个正方形,其中有一个孔。
答案 0 :(得分:2)
执行前需要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);
}
XOR:
联:
路口:
差异:pol1
- pol2
差异:pol2
- pol1
答案 1 :(得分:1)
看起来这个库需要一些Execute方法的PolyTree版本的组合,以及Clipper对象中一些更复杂的多边形构建,它考虑了输入是否包含空洞。
看起来像带孔的绿色多边形看起来只是一个点数组,它应该是一个带有外多边形和内孔多边形的PolyTree。
答案 2 :(得分:-3)
您可以研究的另一件事是在处理几何形状时SQL Server 2008中引入的Spatial数据类型。
https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.types.sqlgeometry.stintersection.aspx
地理位置相同,但使用sqlgeography而不是sqlgeometry
您可以使用.STIntersects()== 1和.STIntersection(AnotherShape)来检索交叉点。还有其他方法可以提供与上述相同的结果。
这样做的好处是,如果将其与数据库结合使用,则可以利用空间索引使其更快。