#多边形 #并集 #差集 #交集 #异或 #操作 #形状

i_overlay

2D多边形的布尔运算:支持交集、并集、差集、异或和所有多边形类型的自交

56个版本 (20个稳定版)

1.4.7 2024年8月21日
1.3.1 2024年7月21日
0.25.0 2024年4月18日
0.24.2 2024年3月31日
0.5.0 2023年11月16日

数学类别中排名75

Download history 416/week @ 2024-05-04 209/week @ 2024-05-11 276/week @ 2024-05-18 49/week @ 2024-05-25 86/week @ 2024-06-01 71/week @ 2024-06-08 233/week @ 2024-06-15 58/week @ 2024-06-22 174/week @ 2024-06-29 98/week @ 2024-07-06 250/week @ 2024-07-13 129/week @ 2024-07-20 24/week @ 2024-07-27 377/week @ 2024-08-03 375/week @ 2024-08-10 299/week @ 2024-08-17

每月下载量1,080
3 crates中使用

MIT许可MIT

140KB
3K SLoC

iOverlay

Balloons

iOverlay是一个快速的多边形布尔库,支持并、交、差、异或等主要操作,由偶数奇数或非零规则控制。该算法基于Vatti裁剪的想法,但是一个原创的实现。

文档

使用交互式演示尝试iOverlay

功能

  • 操作:并、交、差、排除。
  • 多边形:带孔、自交、多条路径。
  • 简化:删除退化顶点并合并共线边。
  • 填充规则:偶数奇数和非零。

入门指南

将以下内容添加到您的Cargo.toml中

[dependencies]
i_overlay = "^1.4"

你好,世界

让我们合并两个正方形

let subj = [
    F64Point::new(-10.0, -10.0),
    F64Point::new(-10.0, 10.0),
    F64Point::new(10.0, 10.0),
    F64Point::new(10.0, -10.0),
];

let clip = [
    F64Point::new(-5.0, -5.0),
    F64Point::new(-5.0, 15.0),
    F64Point::new(15.0, 15.0),
    F64Point::new(15.0, -5.0),
];

let mut overlay = FloatOverlay::new();

overlay.add_path(&subj, ShapeType::Subject);
overlay.add_path(&clip, ShapeType::Clip);

let graph = overlay.into_graph(FillRule::NonZero);
let shapes = graph.extract_shapes(OverlayRule::Union);

println!("shapes count: {}", shapes.len());

if shapes.len() > 0 {
    let contour = &shapes[0][0];
    println!("shape 0 contour: ");
    for p in contour {
        let x = p.x;
        let y = p.y;
        println!("({}, {})", x, y);
    }
}

形状结果

extract_shapes函数的输出是Vec<Vec<Vec<F64Point>>>,其中

  • 外层的Vec<F64Shape>表示一组形状。
  • 每个形状Vec<F64Path>表示一组路径,其中第一条路径是外部边界,所有后续路径都是该边界的孔。
  • 每个路径Vec<F64Point>是一系列点,形成一个封闭路径。

注意:外边界路径是顺时针顺序,孔是逆时针顺序。

叠加规则

并集,A或B

Union

交集,A和B

Intersection

差集,B - A

Difference

排除,A xor B

Exclusion

依赖关系

~0.5–1.3MB
~30K SLoC