diff --git a/crates/fj-core/src/geometry/util/mod.rs b/crates/fj-core/src/geometry/util/mod.rs index 1bc0744df..b5fc9803f 100644 --- a/crates/fj-core/src/geometry/util/mod.rs +++ b/crates/fj-core/src/geometry/util/mod.rs @@ -7,38 +7,4 @@ //! module provides an easy place to put new things, before it's clear what to //! do with them long-term. -use fj_math::{Aabb, Point}; - -use super::{traits::GenPolyline, CurveBoundary, Tolerance}; - -/// # Convert a point on a curve from curve coordinates to surface coordinates -pub fn curve_point_to_surface_point( - curve: &dyn GenPolyline<2>, - point_curve: impl Into>, - tolerance: impl Into, -) -> Point<2> { - let point_curve = point_curve.into(); - let tolerance = tolerance.into(); - - let line_segment = curve.line_segment_at(point_curve, tolerance); - let line = line_segment.to_line(); - - line.point_from_line_coords(point_curve) -} - -/// # Generate a 2D axis-aligned bounding box for a curve in a given range -pub fn surface_aabb_from_bounded_curve( - curve: &dyn GenPolyline<2>, - boundary: impl Into>>, - tolerance: impl Into, -) -> Aabb<2> { - let boundary = boundary.into(); - let tolerance = tolerance.into(); - - let points_curve = curve.generate_polyline(boundary, tolerance); - let points_surface = points_curve.into_iter().map(|point_curve| { - curve_point_to_surface_point(curve, point_curve, tolerance) - }); - - Aabb::<2>::from_points(points_surface) -} +pub mod polyline; diff --git a/crates/fj-core/src/geometry/util/polyline.rs b/crates/fj-core/src/geometry/util/polyline.rs new file mode 100644 index 000000000..615d3df06 --- /dev/null +++ b/crates/fj-core/src/geometry/util/polyline.rs @@ -0,0 +1,37 @@ +//! # Geometric utility code based on polylines + +use fj_math::{Aabb, Point}; + +use crate::geometry::{traits::GenPolyline, CurveBoundary, Tolerance}; + +/// # Convert a point on a curve from curve coordinates to surface coordinates +pub fn curve_point_to_surface_point( + curve: &dyn GenPolyline<2>, + point_curve: impl Into>, + tolerance: impl Into, +) -> Point<2> { + let point_curve = point_curve.into(); + let tolerance = tolerance.into(); + + let line_segment = curve.line_segment_at(point_curve, tolerance); + let line = line_segment.to_line(); + + line.point_from_line_coords(point_curve) +} + +/// # Generate a 2D axis-aligned bounding box for a curve in a given range +pub fn surface_aabb_from_bounded_curve( + curve: &dyn GenPolyline<2>, + boundary: impl Into>>, + tolerance: impl Into, +) -> Aabb<2> { + let boundary = boundary.into(); + let tolerance = tolerance.into(); + + let points_curve = curve.generate_polyline(boundary, tolerance); + let points_surface = points_curve.into_iter().map(|point_curve| { + curve_point_to_surface_point(curve, point_curve, tolerance) + }); + + Aabb::<2>::from_points(points_surface) +}