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

时间:2010-11-23 17:40:43

标签: java c ruby svg computational-geometry

我有SVG paths-like syntax中指定的2D闭合矢量路径 - 即这些路径包括直线和各种贝塞尔曲线。有没有像小巧,漂亮的东西;离散库(最好用C语言,Java语言或Ruby语言,但如果这个库很干净且易于使用,那么任何语言都会这样做),允许用这些路径进行联合,交集和减法等布尔运算?

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

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

所以,问题是,是否还有其他任何小的,好的&浮动的简单库可以处理类似SVG的路径上的布尔操作吗?

2 个答案:

答案 0 :(得分:5)

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

  

Area对象存储和操作二维空间的封闭区域的与分辨率无关的描述。 Area个对象可以转换,可以执行各种操作   与其他Area对象组合时的构造区域几何(CAG)操作。 CAG操作包括区域加法,减法,交集和异或。

答案 1 :(得分:2)

你可以JavaScript ClipperAngus Johnson's Clipper的端口(用Delphi,C ++,C#和Python编写),而后者又基于Bala R. Vatti's clipping algorithm。它能够处理所有多边形情况,包括自相交的情况。

请记住,lib只占用多边形,所以any curves need to be polygonized首先