Die Oberfläche ist lokalisiert; Skill-Beschreibungen und -Dokumente werden per KI automatisch in Ihre Sprache übersetzt. Code, Befehle, Pfade und Fachbegriffe bleiben im Original, maßgeblich ist das Dokument des Autors.
Skills entdecken
Produktivität · SKILL.md

clipper2

clipper2

Use when performing high-performance 2D polygon boolean operations (union, intersection, difference, XOR) and offsetting via C++, C#, or Python bindings. Clipper2: the modern polygon clipping library with robust numerical handling.

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill-Dokumentation

GitHub

name: clipper2 description: "Use when performing high-performance 2D polygon boolean operations (union, intersection, difference, XOR) and offsetting via C++, C#, or Python bindings. Clipper2: the modern polygon clipping library with robust numerical handling." tags:

  • 2d
  • geometry
  • boolean
  • offset
  • polygon
  • csharp
  • cpp
  • delphi

项目地址: https://github.com/AngusJohnson/Clipper2

官方文档: http://www.angusj.com/clipper2/Docs/Overview.htm

最新稳定版: 2.0.1(截至2026年9月,tag Clipper2_2.0.1)

NuGet: Clipper2

许可证: Boost Software License 1.0

概述

Clipper2 相对 Clipper1 的提升:

  • 全新算法,速度更快、内存更省
  • 支持浮点(PathsD)与整数(Paths64)双模式
  • 全新偏移引擎:更鲁棒的 mitre/square/round 端帽与连接
  • 简洁 API:Union/Intersect/Difference/Xor 顶级函数
  • 多语言:C++、C#、Delphi、JS(Clipper2.js 移植)

安装

C#

dotnet add package Clipper2     # 提供 Clipper2Lib 命名空间

C++

# vcpkg
vcpkg install clipper2
# 或直接 add subdirectory CPP/Clipper2Lib 到 CMake

JavaScript

npm install clipper2-js        # 第三方原生 TS/JS 移植;另有 WASM 移植 js-angusj-clipper

核心数据结构(C#)

using Clipper2Lib;

PointD pd = new(10.5, 20.7);            // 浮点点
PathD  path = new() { new(0,0), new(10,0), new(10,10), new(0,10) };
PathsD subj = new() { path };           // 多个 path
PathsD clip = new() { /* ... */ };

整数版本:Point64 / Path64 / Paths64,避免浮点误差。


布尔运算

using Clipper2Lib;

PathsD a = new() { Clipper.MakePath(new[] { 0d,0, 100,0, 100,100, 0,100 }) };
PathsD b = new() { Clipper.MakePath(new[] { 50d,50, 150,50, 150,150, 50,150 }) };

PathsD u = Clipper.Union(a, b, FillRule.NonZero);
PathsD i = Clipper.Intersect(a, b, FillRule.NonZero);
PathsD d = Clipper.Difference(a, b, FillRule.NonZero);
PathsD x = Clipper.Xor(a, b, FillRule.NonZero);

FillRule:

  • EvenOdd(奇偶)
  • NonZero(非零)
  • Positive(正向缠绕)
  • Negative(负向缠绕)

多边形偏移(Inflate / 缩进)

PathsD outline = new() {
    Clipper.MakePath(new[] { 0d,0, 100,0, 100,100, 0,100 })
};

// 向外偏移 10 单位
PathsD outer = Clipper.InflatePaths(outline, 10,
    JoinType.Round,        // Square / Miter / Round
    EndType.Polygon);       // Polygon / Joined / Butt / Square / Round

// 向内偏移:负数
PathsD inner = Clipper.InflatePaths(outline, -10,
    JoinType.Miter, EndType.Polygon);

EndType:

  • Polygon 闭合多边形
  • Joined 开放多线段,端点首尾相连
  • Butt / Square / Round 开放线段端帽

高级用法(ClipperD/Clipper64 类)

需要更精细控制(PolyTree、ZFill 回调等):

ClipperD clipper = new(2);   // 2 = 浮点保留 2 位小数精度

clipper.AddSubject(subj);
clipper.AddClip(clip);

PolyTreeD tree = new();
clipper.Execute(ClipType.Union, FillRule.NonZero, tree);
PathsD result = tree.GetAllPaths(FillRule.NonZero);

PolyTree 保留外环/内孔的层级关系,对于带孔多边形非常重要。


实用工具

double area = Clipper.Area(path);                       // 有符号面积
PointD c    = Clipper.Centroid(path);                   // 形心
RectD bbox  = Clipper.GetBounds(paths);                 // 包围盒

PathsD simp = Clipper.SimplifyPaths(paths, 0.5);        // 简化(容差)
PathsD ramer = Clipper.RamerDouglasPeucker(paths, 0.5); // RDP 简化

PathsD trim = Clipper.TrimCollinear(paths);             // 去共线点

// 闵可夫斯基和/差(轮廓膨胀工具)
PathD mink = Clipper.MinkowskiSum(pattern, path, false);

C++ 用法

#include "clipper2/clipper.h"
using namespace Clipper2Lib;

PathsD subj{ MakePathD({0,0, 100,0, 100,100, 0,100}) };
PathsD clip{ MakePathD({50,50, 150,50, 150,150, 50,150}) };

auto u = Union(subj, clip, FillRule::NonZero);
auto inflated = InflatePaths(u, 10.0, JoinType::Round, EndType::Polygon);

典型工作流

工作流一:2D 轮廓布尔运算(C#)

  1. 通过 Clipper.MakePath 或手工构造 PathD/Path64 列表
  2. 选择 FillRule(一般用 NonZero)
  3. 直接调用静态函数 Clipper.Union(a, b, FillRule.NonZero)
  4. 如需 PolyTree(孔洞层级),使用 ClipperD 类 + PolyTreeD
  5. 对结果进行 SimplifyPaths 或 TrimCollinear 清理
  6. 导出结果,转换为下游格式(如转回 DXF polyline)

工作流二:多边形膨胀与缩进(CAM 刀路补偿)

  1. 从 CAD 文件读取零件轮廓多边形
  2. 使用 Clipper.InflatePaths(paths, offset, JoinType.Round, EndType.Polygon) 生成刀路偏置
  3. 正值外扩(粗加工),负值内缩(精加工)
  4. 对偏移结果做 SimplifyPaths,去除多余顶点
  5. 输出为 G-code 或 CAM 系统格式

性能要点

  1. 优先 Path64 + 适当 scale:浮点版内部仍用整数实现,避免精度问题
  2. SimplifyPaths 在大量数据布尔前预处理,减少顶点
  3. 避免共线点:TrimCollinear
  4. 大对象用 PolyTree:避免重新计算外/内环关系
  5. Inflate 注意 miter limit:尖角处可能产生超大顶点
  6. 多线程:Clipper2 单实例非线程安全,多线程需独立实例

常见问题

问题解决
输出空集检查 FillRule、方向(逆时针 vs 顺时针)、闭合性
偏移变形调整 JoinType 与 MiterLimit
浮点精度异常改用 Path64 或 ClipperD(precision)
与 Clipper1 不兼容API 已变化,参考迁移指南

与其它库对比

库语言主要特性
Clipper2C++/C#/Delphi/JS高性能布尔+偏移,AGG 兼容
CGAL BooleanC++精确算术,复杂但慢
JTS / NTSJava/.NET完整空间分析,速度中等
Boost.PolygonC++仅整数,高性能

AI 使用建议

  • 推荐工作流模式:新项目优先使用 Clipper2 的静态顶层函数(Union/Intersect/Difference/Xor/InflatePaths),比 Clipper1 的类实例方式更简洁。浮点模式直接用 PathsD,整数模式用 Paths64(指定 scale)。
  • 关键注意事项:① FillRule 默认用 NonZero;② InflatePaths 的 JoinType 和 MiterLimit 影响偏移质量——圆形连接(Round)最稳健;③ 浮点模式下 ClipperD(precision) 的 precision 参数控制内部整数转换精度;④ PolyTree 保留孔洞层级。
  • 常用代码模式:Clipper.Union(pathsA, pathsB, FillRule.NonZero) → Clipper.InflatePaths(result, offset, JoinType.Round, EndType.Polygon) → Clipper.SimplifyPaths(result, tolerance)。

相关技能


参考资源

Gespeicherte Skills