diff --git a/src/scene/boundary.rs b/src/scene/boundary.rs index 1e0c12ce0..62dfdb82b 100644 --- a/src/scene/boundary.rs +++ b/src/scene/boundary.rs @@ -301,8 +301,8 @@ impl Scene { /// Build closed planar regions from the visible wire geometry. /// - /// Unlike `closed_outlines()`, the source entities do not need to be closed - /// individually. Intersections are inserted as temporary graph vertices and + /// Source entities do not need to be closed individually. Intersections are + /// inserted as temporary graph vertices and /// the bounded faces of that planar graph are returned as hatch candidates. /// /// Curved entities participate through their already-tessellated WireModel diff --git a/src/scene/mod.rs b/src/scene/mod.rs index ad546ffb8..d3f263a08 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -4646,71 +4646,6 @@ impl Scene { names } - /// Collect closed polygon outlines (world XY) from the current layout. - pub fn closed_outlines(&self) -> Vec> { - self.entity_wires() - .iter() - .filter_map(|wire| { - let pts: Vec<[f64; 2]> = wire - .points - .iter() - .copied() - .enumerate() - .filter_map(|(index, high)| { - if !high[0].is_finite() || !high[1].is_finite() { - return None; - } - let low = wire.points_low.get(index).copied().unwrap_or([0.0; 3]); - let point = [ - high[0] as f64 + low[0] as f64, - high[1] as f64 + low[1] as f64, - ]; - point.iter().all(|value| value.is_finite()).then_some(point) - }) - .collect(); - if pts.len() < 4 { - return None; - } - let f = pts.first()?; - let l = pts.last()?; - let dx = f[0] - l[0]; - let dy = f[1] - l[1]; - if (dx * dx + dy * dy).sqrt() > 1e-2 { - return None; - } - // Segment-list wires (e.g. LwPolyline) store each segment as an - // independent NaN-separated pair, so every shared corner repeats - // (`A B | B C | C D | D A`). Collapse that back into a clean ring: - // skip the NaN separators and any vertex coincident with the - // previous one, so consumers (point-in-polygon, the hatch / - // boundary commands) see one vertex per corner — not the doubled - // ring that otherwise shows two grips at every corner. - let mut ring: Vec<[f64; 2]> = Vec::with_capacity(pts.len()); - for q in pts { - if let Some(&last) = ring.last() { - if (last[0] - q[0]).abs() < 1e-4 && (last[1] - q[1]).abs() < 1e-4 { - continue; - } - } - ring.push(q); - } - // Drop a trailing vertex equal to the first — the ring is closed - // implicitly, so keeping it would be a duplicate corner. - if ring.len() > 1 { - let first = ring[0]; - let last = *ring.last().unwrap(); - if (first[0] - last[0]).abs() < 1e-4 && (first[1] - last[1]).abs() < 1e-4 { - ring.pop(); - } - } - if ring.len() < 3 { - return None; - } - Some(ring) - }) - .collect() - } - /// Wire set for the Model layout, shared by every tile. /// /// The model wire geometry is **camera-independent**, so it is tessellated