exact-poly 0.3.0

Integer polygon geometry library — exact arithmetic, no float errors
Documentation
use wasm_bindgen::prelude::*;

use super::helpers::*;
use super::types::WasmIndexPair;

#[wasm_bindgen]
pub fn sat_overlap(a_flat: &[i64], b_flat: &[i64]) -> Result<bool, JsValue> {
    let a = parse_flat_ring(a_flat)?;
    let b = parse_flat_ring(b_flat)?;
    if has_zero_length_edge(&a) || has_zero_length_edge(&b) {
        return Err(invalid_input(
            "SAT polygons must not contain zero-length edges",
        ));
    }
    Ok(crate::sat::sat_overlaps(&a, &b))
}

#[wasm_bindgen]
pub fn sat_overlap_with_aabb(a_flat: &[i64], b_flat: &[i64]) -> Result<bool, JsValue> {
    let a = parse_flat_ring(a_flat)?;
    let b = parse_flat_ring(b_flat)?;
    if has_zero_length_edge(&a) || has_zero_length_edge(&b) {
        return Err(invalid_input(
            "SAT polygons must not contain zero-length edges",
        ));
    }
    Ok(crate::sat::sat_overlaps_with_aabb(&a, &b))
}

#[wasm_bindgen]
pub fn convex_parts_overlap(a_flat: &[i64], b_flat: &[i64]) -> Result<bool, JsValue> {
    let a = parse_flat_ring(a_flat)?;
    let b = parse_flat_ring(b_flat)?;
    Ok(crate::overlap::convex_parts_overlap(&a, &b))
}

#[wasm_bindgen(skip_typescript)]
pub fn find_overlapping_parts(
    a_parts_flat: JsValue,
    b_parts_flat: JsValue,
) -> Result<JsValue, JsValue> {
    let a_parts = parse_flat_parts(a_parts_flat)?;
    let b_parts = parse_flat_parts(b_parts_flat)?;
    let overlaps = crate::overlap::find_overlapping_parts(&a_parts, &b_parts)
        .into_iter()
        .map(|(a_index, b_index)| WasmIndexPair { a_index, b_index })
        .collect::<Vec<_>>();
    serialize(&overlaps)
}

#[wasm_bindgen(skip_typescript)]
pub fn parts_overlap(a_parts_flat: JsValue, b_parts_flat: JsValue) -> Result<bool, JsValue> {
    let a_parts = parse_flat_parts(a_parts_flat)?;
    let b_parts = parse_flat_parts(b_parts_flat)?;
    Ok(crate::overlap::parts_overlap(&a_parts, &b_parts))
}