问题标签 [clipperlib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
7150 浏览

c# - 剪辑如何在 Clipper 库中的多边形联合中工作

在此处输入图像描述

我使用Clipper 库。在图中,红色和黑色是剪辑,绿色是多边形。代码如下所示。但是,我不明白为什么(7 3 4 14 9 1 2 6).我认为生成的联合多边形应该是(1 4 14 9)?数字是图中所示的顶点。

编辑:

如果我更改PolyFillType.pftEvenOddPolyFillType.pftNonZero,它工作正常。谁能解释它如何影响结果?

0 投票
1 回答
1925 浏览

c++ - 将多边形坐标从 Double 转换为 Long 以用于 Clipper 库

我有两个多边形,它们的顶点存储为双坐标。我想找到这些多边形的相交区域,所以我正在查看Clipper 库(C++ 版本)。问题是,Clipper 仅适用于整数数学(它使用 Long 类型)。

有没有一种方法可以安全地用相同的比例因子转换我的两个多边形,将它们的坐标转换为 Longs,使用 Clipper 执行交叉算法,并用相同的因子将生成的交叉多边形缩小,然后将其转换回 Double没有太多的精度损失?

我无法完全理解如何做到这一点。

0 投票
1 回答
2624 浏览

c# - C# 使用剪裁器库剪裁线段

我正在使用裁剪器对代表程序中对象轮廓的多边形执行一堆操作。问题是,我现在想剪下一个线段网格来填充这些轮廓,但我很难用 Clipper 来做到这一点。

目前我正在将我的线条转换为厚度为 2 个单位的矩形,然后我对其进行交叉操作,最后我需要将新的多边形恢复为线段。这虽然效率很低,但会产生相当多的错误。

这可以用 Clipper 完成吗,如果没有,我可以使用其他东西还是需要实现我自己的线段剪裁器?

0 投票
1 回答
837 浏览

c# - 使用 C# 剪裁器偏移时出现尖峰

使用剪裁器库偏移多边形时,我得到了很多尖峰,不幸的是,这在我的用例中是不可接受的,我不知道如何摆脱它。我尝试了所有类型的连接类型设置,但无法实现任何目标。任何帮助将不胜感激。

我的应用程序分层模型并计算轮廓多边形。然后它还必须偏移轮廓。具有大量曲线的图层往往会出现一个或多个尖峰,例如: 在此处输入图像描述

现在这似乎还不错,但是一旦它发生在很多层上,模型就会变成这样: 在此处输入图像描述

重要的是要注意,在不偏移轮廓的情况下,我没有得到这些尖峰。

这是一个包含输入多边形的文件: http: //sdrv.ms/H7ysUC

这是一个包含输出多边形的文件: http: //sdrv.ms/1fLoZjT

该操作的参数是带有默认限制的 jtRound JointType 的偏移操作。增量为-25000。我还尝试了所有其他 JoinTypes,限制范围从 0 到 1000,但它们都创建了完全相同的尖峰。其他的 JoinTypes 虽然有一些其他的奇怪的效果。

0 投票
1 回答
1954 浏览

c# - 多边形差异 - Clipperlib 的奇怪结果

我正在尝试从一组轮廓创建等面积多边形(“甜甜圈”)。这是过程:

  1. 生成轮廓。
  2. 将等高线排序为树状结构,以使特定等高线内的所有等高线都是该等高线的子代。
  3. 对于每个轮廓,使用 Clipperlib 对其所有子项执行差异操作。

生成的多边形和孔构成等面积“甜甜圈”。然后可以将这些等值区域渲染为等高线图,或用于其他目的。请注意,如果我只想渲染轮廓,我可以在初始排序后停止并按顺序渲染轮廓,这样最里面的渲染就在顶部。我确实需要实际的区域。

首先 - Clipperlib 是一个很棒的库,我很乐意花大价钱购买它 - 感谢 Angus!

我的问题是,在某些情况下,我似乎从差异操作中得到了一些奇怪的结果——我怀疑这可能是我的用户错误,所以我将说明问题:

图一

这张图片显示了两个多边形 - 主体用红色勾勒出来,孩子们用蓝色填充。我想从主题中减去孩子。注意鼠标指针附近的小区域。我对这个差异的期望是两个外部多边形 - 靠近鼠标指针的小一个和大一个。我进一步希望所有“岛屿”都是第二个大多边形内的洞。

我实际上得到的是两个外部(如预期的那样),每个外部都有孩子(洞):

图二

在此处输入图像描述

在第二幅图中,鼠标指针附近的小多边形是“外部”,所有其他填充的多边形都是属于它的“孔”。请注意,我在两个图像中都显示了两种解决方案的轮廓 - 只需关注填充的多边形。

我正在使用第一张图像中的红色多边形作为主题执行clipperlib,并将所有子项作为剪辑。剪辑类型是 ctDifference (我也尝试过 Xor 得到相同的结果 - 他们应该是这样,因为所有孩子都在主题内)。我要一个 PolyTree 回来,它有两个孩子。我正在使用 c# 库,并且也尝试过 v6。

在一个层面上,我需要的结果都在那里——所有的“洞”都被指定为这样,问题是这些洞中有许多是作为图像右上角的微小外部区域的子级返回的。我是在错误地阅读 PolyTree,错误地使用 ClipperLib,还是这个结果完全错误?

进一步说明 - 我注意到新的 ClipperLib (v6) 现在接受 Z 值。我现在想知道是否有比我用来从给定的无序轮廓线集合生成这些等区域更好的方法?

谢谢,马特

编辑:我已经在文本文件中上传了多边形的原始数据。

链接在这里

该文件将主题多边形作为第一组顶点,然后是每个子顶点。每个多边形表示为单行上的 X/Y 对,每个多边形之间有一个换行符。

0 投票
2 回答
3345 浏览

javascript - googlemaps 多边形与clipper.js 的联合

我正在尝试将 Google 地图(API v3 Javascript)上的 2 个多边形(绿色)与 Clipper.js 合并。

之前:http: //jsfiddle.net/kevdiho/tc53Y/

我的目标是只有 1 个多边形(红色)。问题是最终的多边形并不完全遵循路径,有时甚至更糟。

之后:http: //jsfiddle.net/kevdiho/uF6ec/

合并 2 个绿色多边形,我使用了 clipper.js 和这个函数 ClipperLib.ClipType.ctUnion

我怎么解决这个问题?Clipper.js 是一个很好的答案,还是有其他库可以处理 googlemaps 多边形?

0 投票
1 回答
391 浏览

c++ - 使用 Angus Johnsons 的 Clipper 库中的 OffsetPolygon 时,Polygon 中出现奇怪的“缺口”

在此处输入图像描述

这段代码的最终目标是确保客户定义的形状实际上可以由我们的……呃,机器加工。为此,我们将指定形状向内偏移钻头的半径,然后向外返回相同的量,从而将任何太瘦而无法实际放入钻头的部分四舍五入。对于多边形偏移,我们使用的是 Angus Johnson 的Clipper库,版本 5.1.6 (c++)。

但从图片中可以看出,这导致了一些意想不到的形状。在图片中,我用 -radius 偏移了原始形状(绿色,大部分被后来的绘图覆盖)ClipperLib::OffsetPolygon得到黄色形状,然后通过半径偏移得到红色形状。

从理论上讲,对于链接中显示的情况,这应该导致红色形状与绿色形状完全匹配。

使上述结果发生可能会出现什么问题?

0 投票
1 回答
1827 浏览

c# - 如何使用 Clipper 库来放大和填充路径

我正在尝试使用 Clipper 库来修改图形路径。

我有代表轮廓/笔划的宽度列表。我想先从最大的开始,然后一直到最小的。

在本例中,我们将添加 2 个宽度分别为 20 和 10 的笔画。

我想采用我的图形路径,并将其扩展/偏移 20 像素到一个新的图形路径中。我不想改变原来的路径。然后我想用纯色填充新的图形路径。

接下来,我想采用我原来的图形路径,并将其扩展/偏移 10 个像素,形成一个新的图形路径。我想用不同的颜色填充这条新路径。

然后我想用不同的颜色填充我的原始路径。

这样做的正确方法是什么。我创建了以下方法来尝试执行此操作,但它无法正常工作。

0 投票
5 回答
902 浏览

c++ - C++ 无法从函数返回对象

我正在尝试使用 C++“剪辑器库”(http://www.angusj.com/delphi/clipper.php),但是当我尝试从函数中返回剪辑器库中的一个对象时,似乎变为空或以某种方式改变

这是我写的函数。唯一相关的行应该是最后 3 行。

当我调用clipper.execute 时,它​​会将一些轮廓信息写入树结构。它写入了正确的信息,我已经测试它是正确的。但是,当我返回树时,它似乎没有复制任何内容,并且此函数产生的 PolyTree 是空的。

我确信这个库没有任何问题,我只是在这里犯了一个初学者 C++ 错误。希望有人知道它可能是什么。

谢谢!

编辑:作为参考,这里是 polytree 的文档页面(http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm

编辑:我认为 Clipper 库不是开源的,但它是。这是代码

0 投票
1 回答
298 浏览

clipperlib - Clipper 库联合函数错误

我正在尝试在 Clipper 库中执行两个多边形的“联合”。问题是两个多边形的两个最近的边之间有 2 毫米的间隙。所以结果仍然是两个多边形。如果多边形之间的间隙小于 5 毫米,有没有办法消除它?

提前致谢。