Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ClipperLib使用矩形剪裁多个正方形产生1个结果_C#_Clipperlib - Fatal编程技术网

C# ClipperLib使用矩形剪裁多个正方形产生1个结果

C# ClipperLib使用矩形剪裁多个正方形产生1个结果,c#,clipperlib,C#,Clipperlib,我使用的是C#版本的ClipperLib的v6.4.2。 我有很多方块组成一个鱼网。我还有一个长方形。 我想得到一个结果,其中只返回矩形内的正方形,并对部分重叠的正方形进行剪裁。 主题为绿色,剪辑为红色: 我得到的结果是棕色/灰色矩形,它只是一个多边形: 我本以为会有15个完整的方块和13个裁剪方块作为结果 这是我正在使用的代码: var startX = 100; var startY = 250; const int numPolygons = 10; var subj = new P

我使用的是C#版本的ClipperLib的v6.4.2。 我有很多方块组成一个鱼网。我还有一个长方形。 我想得到一个结果,其中只返回矩形内的正方形,并对部分重叠的正方形进行剪裁。 主题为绿色,剪辑为红色:

我得到的结果是棕色/灰色矩形,它只是一个多边形:

我本以为会有15个完整的方块和13个裁剪方块作为结果

这是我正在使用的代码:

var startX = 100;
var startY = 250;
const int numPolygons = 10;

var subj = new Polygons(numPolygons * numPolygons);
for (var i = 0; i < numPolygons; i++)
{
    for (var j = 0; j < numPolygons; j++)
    {
        var square = new Polygon(4)
        {
            new IntPoint(startX, startY),
            new IntPoint(startX + 10, startY),
            new IntPoint(startX + 10, startY - 10),
            new IntPoint(startX, startY - 10)
        };
        subj.Add(square);
        // Moving to the right
        startX = startX + 10;
    }
    // Moving down
    startY = startY - 10;
    startX = 100;
}

var clip = new Polygons(1);
clip.Add(new Polygon(4));
clip[0].Add(new IntPoint(165, 215));
clip[0].Add(new IntPoint(255, 215));
clip[0].Add(new IntPoint(255, 155));
clip[0].Add(new IntPoint(165, 155));

var solution = new Polygons();
var c = new Clipper.Clipper();
c.AddPaths(subj, PolyType.ptSubject, true);
c.AddPaths(clip, PolyType.ptClip, true);
c.Execute(ClipType.ctIntersection, solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
Debug.WriteLine("solution.Count: " + solution.Count);
var startX=100;
var-startY=250;
常量int numPolygons=10;
var subj=新多边形(numPolygons*numPolygons);
对于(变量i=0;i
当运行上述代码时,大约需要0.5秒。因为结果看起来像是剪辑和主题被切换了,所以我切换了它们。结果是一样的,但现在只需要0.1秒。所以做了一些额外的事情。我认为这是结果方块的合并


我不希望结果合并。我怎样才能防止呢?或者我的代码有问题?

在这种情况下,您可以轻松地手工计算结果,而无需使用clipper库

所有矩形都是矩形的这一事实使得计算速度加快成为可能,因此它甚至可以更快地自己执行操作。

根据
Execute
方法的Clipper:

关于返回的解决方案路径,有几点需要注意:

。。。 多边形可能很少共享公共边(尽管从版本6开始,这种情况现在非常罕见)

我认为这意味着在执行任何剪切操作时,路径都会被合并

我试着用不同的PolyFillType做同样的事情,但也没有成功


您可能希望在每次迭代中针对剪切区域分别对每个方块(主题)运行
Execute
方法,这应该可以完成任务,尽管性能可能会因此受到影响。

实际上,我使用的是地理参考文件。其中一个有220万个可以旋转的正方形,但这个正方形彼此相邻。边界是具有许多点的地块边界。使用GDAL/GEOS进行剪裁不起作用。40分钟后,我取消了。使用clipper和一个主题(square)一次只需3分钟,因此性能足够好。我会接受你的回答。一个小小的补充:我将
foreach主题
更改为
Parallel.foreach
,并使用
System.Collections.Concurrent.ConcurrentBag()
存储所有解决方案,现在时间仅为52秒!Paul,Clipper的最新版本(仍在开发中,但稳定且速度更快,在正式发布之前不太可能有太大变化)没有任何多边形合并,所以应该做你想做的。或者,您也可以注释掉旧Clipper中ExecuteInternal方法中的JoinCommonEdge()语句。