use brepkit_math::nurbs::surface::NurbsSurface;
use brepkit_math::surfaces::{
ConicalSurface, CylindricalSurface, SphericalSurface, ToroidalSurface,
};
use crate::GeomError;
pub fn cylinder_to_nurbs(
cyl: &CylindricalSurface,
v_range: (f64, f64),
) -> Result<NurbsSurface, GeomError> {
Ok(cyl.to_nurbs(v_range.0, v_range.1)?)
}
pub fn sphere_to_nurbs(sphere: &SphericalSurface) -> Result<NurbsSurface, GeomError> {
Ok(sphere.to_nurbs()?)
}
pub fn cone_to_nurbs(
cone: &ConicalSurface,
v_range: (f64, f64),
) -> Result<NurbsSurface, GeomError> {
Ok(cone.to_nurbs(v_range.0, v_range.1)?)
}
pub fn torus_to_nurbs(torus: &ToroidalSurface) -> Result<NurbsSurface, GeomError> {
Ok(torus.to_nurbs()?)
}
#[cfg(test)]
mod tests {
#![allow(clippy::unwrap_used, clippy::expect_used)]
use brepkit_math::surfaces::{
ConicalSurface, CylindricalSurface, SphericalSurface, ToroidalSurface,
};
use brepkit_math::vec::{Point3, Vec3};
use super::*;
fn origin() -> Point3 {
Point3::new(0.0, 0.0, 0.0)
}
fn z_axis() -> Vec3 {
Vec3::new(0.0, 0.0, 1.0)
}
#[test]
fn cylinder_to_nurbs_evaluates() {
let cyl = CylindricalSurface::new(origin(), z_axis(), 2.0).unwrap();
let nurbs = cylinder_to_nurbs(&cyl, (0.0, 5.0)).unwrap();
let (u0, u1) = nurbs.domain_u();
let (v0, v1) = nurbs.domain_v();
assert!(u1 > u0);
assert!(v1 > v0);
let pt = nurbs.evaluate((u0 + u1) * 0.5, (v0 + v1) * 0.5);
let dist_from_axis = (Vec3::new(pt.x(), pt.y(), 0.0)).length();
assert!((dist_from_axis - 2.0).abs() < 0.1);
}
#[test]
fn sphere_to_nurbs_evaluates() {
let sphere = SphericalSurface::new(origin(), 3.0).unwrap();
let nurbs = sphere_to_nurbs(&sphere).unwrap();
let (u0, u1) = nurbs.domain_u();
let (v0, v1) = nurbs.domain_v();
assert!(u1 > u0);
assert!(v1 > v0);
let pt = nurbs.evaluate((u0 + u1) * 0.5, (v0 + v1) * 0.5);
let r = Vec3::new(pt.x(), pt.y(), pt.z()).length();
assert!((r - 3.0).abs() < 0.2);
}
#[test]
fn cone_to_nurbs_evaluates() {
let half_angle = std::f64::consts::FRAC_PI_4;
let cone = ConicalSurface::new(origin(), z_axis(), half_angle).unwrap();
let nurbs = cone_to_nurbs(&cone, (0.0, 5.0)).unwrap();
let (u0, u1) = nurbs.domain_u();
let (v0, v1) = nurbs.domain_v();
assert!(u1 > u0);
assert!(v1 > v0);
let _pt = nurbs.evaluate((u0 + u1) * 0.5, (v0 + v1) * 0.5);
}
#[test]
fn torus_to_nurbs_evaluates() {
let torus = ToroidalSurface::new(origin(), 4.0, 1.0).unwrap();
let nurbs = torus_to_nurbs(&torus).unwrap();
let (u0, u1) = nurbs.domain_u();
let (v0, v1) = nurbs.domain_v();
assert!(u1 > u0);
assert!(v1 > v0);
let _pt = nurbs.evaluate((u0 + u1) * 0.5, (v0 + v1) * 0.5);
}
}