用于多边形布尔函数的javascript模块(并集,交集,差异和异或)

时间:2014-06-06 15:05:23

标签: javascript svg geometry polygon intersection

我有多边形集。在这个集合中,一些是外部多边形,一些可能(或可能不是)是孔。在这个阶段我不知道哪个是多边形孔。我想计算包含所有多边形的最终多边形,包括孔。

我想到了这种方法:

//'SomeLib'  that has polygon boolean fucntions
var polygonSet = [poly1,poly2,...polyn];

var union, intersection;
var combinedPoly = SomeLib.XOR(polygonSet[0], polygonSet[1]);
for( var i=2; i<polygonSet.length ; i++) {
  combinedPoly = SomeLib.XOR(combinedPoly, polygonSet[i]);
  //or if XOR is not available  
  union = SomeLib.union(combinedPoly, polygonSet[i]);
  intersection = SomeLib.intersection(combinedPoly, polygonSet[i]);
  combinedPoly = union - intersection;
}

所以我对模块的要求是

  1. 只有四个多边形布尔函数
  2. 如果npm模块可用,那么
  3. 作为多边形组合的轻量级将是许多功能之一。我的意思是应用程序大小已经更多,所以寻找轻量级库。
  4. 效率:在我的情况下,集合中多边形的数量可能不高,但多边形中的点数很多,因此寻找O(k.log(n))而不是O(k.n)
  5. 我遇到的图书馆列表和我理解的一些要点:

    • JSCLipper高效,没有npm模块,github project与soureforge JSClipper同步?
    • kld-intersections多边形交集存在但联合不存在(或我无法找到),还有许多其他函数(除了多边形布尔)。这是this project
    • 的javscript端口
    • polygon.js依赖于jQuery,效率如何? ,没有npm模块,不要与polygon.js
    • 混淆
    • boolean in paper.js其附加的paper.js lib,而不是一个独立的模块
    • raphael-boolean raphael lib的附加组件,而非独立模块
    • tess2.js GLU tesselator移植到Javascript,包含许多tesselation函数 - 多边形布尔函数需要细分吗?我找不到布尔函数,没有文档,测试html页面有一些错误,没有npm模块
    • turf-donuts依赖于另一个大型图书馆JSTS
    • JSTS Topology Suite大型图书馆不是模块化的

    在某些情况下,这些函数是大型库的一部分,其中包含其他函数或库,它们与SVG或地理空间环境一起使用,或者许多函数会添加到现有库中。

    请为我的要求建议哪个图书馆合适?是否还有用于多边形布尔函数的javscript模块库?

2 个答案:

答案 0 :(得分:2)

我使用自己的方法操作SVG凸多边形:

  1. 设置凸多边形逆时针点

  2. 多边形 - 修复Convex / CCW

  3. 凸内多边形点:Jordan曲线定理

  4. 线相交多边形 - 矢量分析

  5. 相交多边形 - 向量分析

  6. 复合相交多边形 - Jordan曲线定理

  7. 凸多边形 - 修剪,使用Sutherland-Hodgman裁剪算法

  8. 显示here

    另外,您可能需要查看this

答案 1 :(得分:0)

我已开始实施Vatti polygon clipping algorithm,此处为the code repository。但我发现Greiner Hormann多边形裁剪算法要好得多。所以我现在不维护the code

我建议在JavaScript中使用Greiner Hormann implementation进行多边形裁剪或其他布尔操作。