i_overlay 0.23.0

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

iOverlay

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
i_shape
i_overlay

Hello world

Let's union two squares

let mut overlay = Overlay::new(2);

let left_bottom_square = FixShape::new_with_contour([
    FixVec::new_f64(-10.0, -10.0),
    FixVec::new_f64(-10.0, 10.0),
    FixVec::new_f64(10.0, 10.0),
    FixVec::new_f64(10.0, -10.0)
].to_vec());

let right_top_square = FixShape::new_with_contour([
    FixVec::new_f64(-5.0, -5.0),
    FixVec::new_f64(-5.0, 15.0),
    FixVec::new_f64(15.0, 15.0),
    FixVec::new_f64(15.0, -5.0)
].to_vec());

// add new geometry
overlay.add_shape(&left_bottom_square, ShapeType::Subject);
overlay.add_shape(&right_top_square, ShapeType::Clip);

// resolve shapes geometry
let graph = overlay.build_graph(FillRule::EvenOdd);

// apply union operation and get result (in our case it will be only one element)
let shapes = graph.extract_shapes(OverlayRule::Union);

// do something with new shapes...

print!("shapes: {:?}", shapes)

Overlay Rules

Union, A or B

Union

Intersection, A and B

Intersection

Difference, B - A

Difference

Exclusion, A xor B

Exclusion