#polygon #union #difference #intersection #xor #operations #self-intersections

i_overlay

Boolean Operations for 2D Polygons: Supports intersection, union, difference, xor, and self-intersections for all polygon varieties

41 releases (5 stable)

new 1.1.0 May 13, 2024
1.0.1 Apr 25, 2024
0.25.0 Apr 18, 2024
0.24.2 Mar 31, 2024
0.5.0 Nov 16, 2023

#239 in Math

Download history 9/week @ 2024-01-22 24/week @ 2024-01-29 112/week @ 2024-02-12 18/week @ 2024-02-19 72/week @ 2024-02-26 30/week @ 2024-03-11 1/week @ 2024-03-18 354/week @ 2024-03-25 696/week @ 2024-04-01 49/week @ 2024-04-08 160/week @ 2024-04-15 345/week @ 2024-04-22 465/week @ 2024-04-29 150/week @ 2024-05-06

1,122 downloads per month
Used in 3 crates

MIT license

160KB
3.5K SLoC

iOverlay

Balloons

The iOverlay is a fast poly-bool library supporting main operations like union, intersection, difference, and xor, governed by either the even-odd or non-zero rule. This algorithm is based on Vatti clipping ideas but is an original implementation.

Documentation

Try out iOverlay with an interactive demo:

Features

  • Operations: union, intersection, difference, and exclusion.
  • Polygons: with holes, self-intersections, and multiple paths.
  • Simplification: removes degenerate vertices and merges collinear edges.
  • Fill Rules: even-odd and non-zero.

Getting Started

Add the following to your Cargo.toml:

[dependencies]
i_float = "^1.0.0"
i_overlay = "^1.0.0"

Hello world

Let's union two squares

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.build_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);
    }
}

Overlay Rules

Union, A or B

Union

Intersection, A and B

Intersection

Difference, B - A

Difference

Exclusion, A xor B

Exclusion

Dependencies

~0.5–1MB
~25K SLoC