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::WasmDecomposeResult;

#[wasm_bindgen(skip_typescript)]
pub fn decompose_polygon(
    ring_flat: &[i64],
    allow_steiner: bool,
    collect_trace: Option<bool>,
    minimize_parts: Option<bool>,
    config: Option<JsValue>,
) -> Result<JsValue, JsValue> {
    let ring = parse_flat_ring(ring_flat)?;
    let config = parse_config(config)?;
    let options = crate::types::DecomposeOptions {
        allow_steiner,
        collect_trace: collect_trace.unwrap_or(false),
        minimize_parts: minimize_parts.unwrap_or(false),
        ..Default::default()
    };

    let result = crate::decompose::decompose(&ring, &options, &config)
        .map_err(|err| JsValue::from_str(&err.to_string()))?;

    serialize(&WasmDecomposeResult {
        parts: flatten_parts(&result.parts),
        steiner_points: flatten_ring(&result.steiner_points),
        strategy: result.strategy,
        trace: result.trace,
    })
}

#[wasm_bindgen(skip_typescript)]
pub fn collect_steiner_points(ring_flat: &[i64], parts_flat: JsValue) -> Result<JsValue, JsValue> {
    let ring = parse_flat_ring(ring_flat)?;
    let parts = parse_flat_parts(parts_flat)?;
    let steiner = crate::decompose::collect_steiner_points(&ring, &parts);
    serialize(&flatten_ring(&steiner))
}

#[wasm_bindgen(skip_typescript)]
pub fn bayazit_decompose_polygon(
    ring_flat: &[i64],
    allow_steiner: bool,
) -> Result<JsValue, JsValue> {
    let ring = parse_flat_ring(ring_flat)?;
    let parts = crate::bayazit::bayazit_decompose(
        &ring,
        allow_steiner,
        &crate::types::ProtocolConfig::merca(),
    )
    .map_err(|err| JsValue::from_str(&err))?;
    serialize(&flatten_parts(&parts))
}

#[wasm_bindgen(skip_typescript)]
pub fn exact_vertex_partition_polygon(ring_flat: &[i64]) -> Result<JsValue, JsValue> {
    let ring = parse_flat_ring(ring_flat)?;
    let parts = crate::exact_partition::exact_vertex_partition(&ring)
        .map_err(|err| JsValue::from_str(&err))?;
    serialize(&flatten_parts(&parts))
}

#[wasm_bindgen(skip_typescript)]
pub fn exact_partition_only_original_vertices(
    ring_flat: &[i64],
    parts_flat: JsValue,
) -> Result<bool, JsValue> {
    let ring = parse_flat_ring(ring_flat)?;
    let parts = parse_flat_parts(parts_flat)?;
    Ok(crate::exact_partition::only_original_vertices(
        &ring, &parts,
    ))
}

#[wasm_bindgen(skip_typescript)]
pub fn ear_clip_triangulate_polygon(ring_flat: &[i64]) -> Result<JsValue, JsValue> {
    let ring = parse_flat_ring(ring_flat)?;
    let parts =
        crate::ear_clip::ear_clip_triangulate(&ring).map_err(|err| JsValue::from_str(&err))?;
    serialize(&flatten_parts(&parts))
}