【问题标题】:javascript module for polygon boolean functions (union, intersection, difference and XOR) [closed]用于多边形布尔函数(联合、交集、差异和 XOR)的 javascript 模块 [关闭]
【发布时间】:2026-01-30 03:25:01
【问题描述】:

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

我想到了这个办法:

//'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)

我遇到的库列表以及我理解的一些要点:

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

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

请根据我的要求建议哪个库是合适的?还有更多用于多边形布尔函数的 javscript 模块化库吗?

【问题讨论】:

    标签: javascript svg geometry polygon intersection


    【解决方案1】:

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

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

    2. 多边形 - 修复凸/逆时针

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

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

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

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

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

    这些显示在here

    另外,您可能想查看this

    【讨论】:

    • 不,我实际上使用方法2强制凸,并确保点在CCW方向。
    【解决方案2】:

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

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

    【讨论】: