Geometry

The geometry module provides geometric primitives and operations on polygons.

Bounding Box

#![allow(unused)]
fn main() {
use laykit::{bounding_box, BoundingBox};

let pts = vec![(0.0, 0.0), (10.0, 0.0), (10.0, 5.0), (0.0, 5.0)];
let bb = bounding_box(&pts).unwrap();

println!("width:  {}", bb.width());   // 10.0
println!("height: {}", bb.height());  // 5.0
println!("area:   {}", bb.area());    // 50.0
println!("center: {:?}", bb.center()); // (5.0, 2.5)

// Combine two bounding boxes
let bb2 = BoundingBox { x_min: 5.0, x_max: 20.0, y_min: -2.0, y_max: 3.0 };
let merged = bb.union(&bb2);

// Per-element helpers
use laykit::{gds_element_bounding_box, structure_bounding_box, library_bounding_box};
}

Polygon Metrics

#![allow(unused)]
fn main() {
use laykit::{polygon_area, polygon_perimeter, polygon_centroid, polygon_signed_area};

let square = vec![(0.0,0.0),(10.0,0.0),(10.0,10.0),(0.0,10.0)];

println!("area:      {}", polygon_area(&square));       // 100.0
println!("perimeter: {}", polygon_perimeter(&square));  // 40.0
println!("centroid:  {:?}", polygon_centroid(&square)); // (5.0, 5.0)

// Positive = CCW, negative = CW
let signed = polygon_signed_area(&square);
}

Point-in-Polygon

#![allow(unused)]
fn main() {
use laykit::{point_in_polygon, inside};

let poly = vec![(0.0,0.0),(10.0,0.0),(10.0,10.0),(0.0,10.0)];

assert!(point_in_polygon((5.0, 5.0), &poly));   // inside
assert!(!point_in_polygon((15.0, 5.0), &poly)); // outside

// Batch query across multiple polygons
let results = inside(&[(5.0,5.0),(20.0,20.0)], &[poly]);
// results = [true, false]
}

Transforms

#![allow(unused)]
fn main() {
use laykit::{translate, rotate, scale, mirror_x, mirror_y, affine_transform};

let pts = vec![(1.0, 0.0), (2.0, 0.0)];

let moved    = translate(&pts, 5.0, 3.0);
let rotated  = rotate(&pts, std::f64::consts::PI / 2.0, 0.0, 0.0); // 90°
let scaled   = scale(&pts, 2.0, 2.0, 0.0, 0.0);
let flipped  = mirror_x(&pts, 0.0); // reflect over y = 0
let flipped2 = mirror_y(&pts, 0.0); // reflect over x = 0

// 2×3 affine matrix [a, b, c, d, tx, ty]
let mat = [1.0_f64, 0.0, 0.0, 1.0, 5.0, 3.0]; // pure translation
let transformed = affine_transform(&pts, &mat);
}

Orientation & Utilities

#![allow(unused)]
fn main() {
use laykit::{is_counter_clockwise, ensure_counter_clockwise, fillet, fracture_to_rectangles};

let pts = vec![(0.0,0.0),(10.0,0.0),(10.0,10.0),(0.0,10.0)];

// Check/enforce winding order
let ccw = is_counter_clockwise(&pts);
let enforced = ensure_counter_clockwise(&pts);

// Round polygon corners (radius, points per arc quadrant)
let rounded = fillet(&pts, 1.0, 8);

// Decompose polygon into non-overlapping rectangles
let rects = fracture_to_rectangles(&pts);
}