SVG /矢量图形对象布尔运算(并集,交集,减法)

2022-09-03 15:27:40

我有2D闭合矢量路径,以类似SVG路径的语法指定 - 即这些路径包括直线和各种贝塞尔曲线。有没有像一个小的,漂亮的和离散的库(最好是C,Java或Ruby,但如果这个库干净且易于使用,任何语言都可以做到)允许用这些路径进行布尔运算,如联合,交集和减法?

到目前为止,我发现的包括:

  • 庞大而昂贵的商业矢量图形产品(如Autodesk AutoCAD或Adobe Illustrator),可以使用某种API调用或编写脚本来执行布尔2D路径操作 - 这对于我的目的来说显然是一个过度的。
  • Inkscape开发了内部lib2geom库,缺乏文档,绑定,有一些编译问题,除了Inkscape本身之外,似乎没有在任何项目中使用,看起来相当复杂。
  • CGAL是一个庞大而非常复杂的计算几何库,可以在非常奇怪的对象空间中工作(即,你有疯狂的模板组合,命令式样式函数对这些模板化数据结构进行操作,等等),除了C++之外,似乎没有与其他语言的合理绑定。Python绑定到CGAL似乎被放弃了,对我来说看起来不是很友好。
  • JTS似乎以GIS为中心,只处理直线,而我需要处理类似SVG的贝塞尔曲线。

所以,问题是,是否有任何其他小的,漂亮的和简单的库漂浮在周围来处理类似SVG路径上的布尔运算?


答案 1

也许我错过了一些东西,但是软件包中的类不适合您的需求吗?它们处理二维形状;Area 类专门处理布尔运算:java.awt.geom

对象存储和操作与分辨率无关的二维空间封闭区域的描述。 对象可以变换,并且可以在与其他对象组合时执行各种构造面积几何 (CAG) 操作。CAG 操作包括面积加法、减法、交叉点和排除或。AreaAreaArea


答案 2

你可以使用JavaScript ClipperAngus Johnson的Clipper(用Delphi,C++,C#和Python编写的)的移植,它又基于Bala R. Vatti的剪辑算法。它能够处理所有多边形情况,包括自相交情况。

请记住,lib 只接受多边形,因此任何曲线都需要首先进行多边形化


推荐