geop_core_topology/argument_validation/
pcurve_start_and_end.rs1use geop_core_geometry::{nurb_curve::NurbCurve2D, nurb_surface::NurbSurface3D};
2use geop_core_math::{
3 geop_error::{GeopError, GeopResult},
4 scalars::Scalar,
5 vector::Vector3,
6};
7
8pub fn validate_pcurve_start_and_end<S: Scalar>(
9 surface: &NurbSurface3D<S>,
10 pcurve: &NurbCurve2D<S>,
11 start: &Vector3<S>,
12 end: &Vector3<S>,
13) -> GeopResult<()> {
14 let (t0, t1) = pcurve.domain();
16 let pcurve_start = pcurve.evaluate(t0)?;
17 let pcurve_start_3d = surface.evaluate(pcurve_start[0], pcurve_start[1])?;
18 if !pcurve_start_3d.could_be_equal(&start) {
19 return Err(GeopError::new(format!(
20 "pcurve {pcurve} start point {pcurve_start_3d:?} does not match the given 3D point {start:?} (pcurve start uv {pcurve_start:?})"
21 )));
22 }
23 let pcurve_end = pcurve.evaluate(t1)?;
24 let pcurve_end_3d = surface.evaluate(pcurve_end[0], pcurve_end[1])?;
25 if !pcurve_end_3d.could_be_equal(&end) {
26 return Err(GeopError::new(format!(
27 "pcurve {pcurve} end point {pcurve_end_3d:?} does not match the given 3D point {end:?} (pcurve end uv {pcurve_end:?})"
28 )));
29 }
30 Ok(())
31}