Enum truck_geometry::base::D2
source · pub enum D2 {}
Expand description
curve geometry
Trait Implementations§
source§impl SPDimension for D2
impl SPDimension for D2
source§impl<P> SearchNearestParameter<D2> for BSplineSurface<P>where
P: ControlPoint<f64> + EuclideanSpace<Scalar = f64, Diff = <P as ControlPoint<f64>>::Diff> + MetricSpace<Metric = f64>,
<P as ControlPoint<f64>>::Diff: InnerSpace<Scalar = f64> + Tolerance,
impl<P> SearchNearestParameter<D2> for BSplineSurface<P>where
P: ControlPoint<f64> + EuclideanSpace<Scalar = f64, Diff = <P as ControlPoint<f64>>::Diff> + MetricSpace<Metric = f64>,
<P as ControlPoint<f64>>::Diff: InnerSpace<Scalar = f64> + Tolerance,
source§impl<C: ParametricCurve3D + BoundedCurve> SearchNearestParameter<D2> for ExtrudedCurve<C, Vector3>
impl<C: ParametricCurve3D + BoundedCurve> SearchNearestParameter<D2> for ExtrudedCurve<C, Vector3>
source§impl<V: Homogeneous<f64>> SearchNearestParameter<D2> for NURBSSurface<V>where
Self: ParametricSurface<Point = V::Point, Vector = <V::Point as EuclideanSpace>::Diff>,
V::Point: EuclideanSpace<Scalar = f64> + MetricSpace<Metric = f64>,
<V::Point as EuclideanSpace>::Diff: InnerSpace<Scalar = f64> + Tolerance,
impl<V: Homogeneous<f64>> SearchNearestParameter<D2> for NURBSSurface<V>where
Self: ParametricSurface<Point = V::Point, Vector = <V::Point as EuclideanSpace>::Diff>,
V::Point: EuclideanSpace<Scalar = f64> + MetricSpace<Metric = f64>,
<V::Point as EuclideanSpace>::Diff: InnerSpace<Scalar = f64> + Tolerance,
source§fn search_nearest_parameter<H: Into<SPHint2D>>(
&self,
point: V::Point,
hint: H,
trials: usize
) -> Option<(f64, f64)>
fn search_nearest_parameter<H: Into<SPHint2D>>(
&self,
point: V::Point,
hint: H,
trials: usize
) -> Option<(f64, f64)>
Searches the parameter (u, v)
which minimize |self(u, v) - point|
by Newton’s method
with initial guess (u0, v0)
. If the repeated trial does not converge, then returns None
.
Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(3), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
vec![Vector3::new(0.0, 0.0, 1.0), Vector3::new(1.0, -2.0, 2.0), Vector3::new(1.0, 0.0, 1.0)],
vec![Vector3::new(0.0, 2.0, 2.0), Vector3::new(2.0, 4.0, 4.0), Vector3::new(2.0, 2.0, 2.0)],
vec![Vector3::new(0.0, 4.0, 2.0), Vector3::new(2.0, 8.0, 4.0), Vector3::new(2.0, 4.0, 2.0)],
vec![Vector3::new(0.0, 3.0, 1.0), Vector3::new(1.0, 7.0, 2.0), Vector3::new(1.0, 3.0, 1.0)],
];
let surface = NURBSSurface::new(BSplineSurface::new(knot_vecs, ctrl_pts));
let pt = surface.subs(0.3, 0.7);
let (u, v) = surface.search_nearest_parameter(pt, Some((0.5, 0.5)), 100).unwrap();
assert!(u.near(&0.3) && v.near(&0.7));
Remarks
It may converge to a local solution depending on the hint.
cf. BSplineCurve::search_rational_nearest_parameter
§type Point = <V as Homogeneous<f64>>::Point
type Point = <V as Homogeneous<f64>>::Point
point
source§impl SearchNearestParameter<D2> for Plane
impl SearchNearestParameter<D2> for Plane
source§impl<C: ParametricCurve3D + BoundedCurve> SearchNearestParameter<D2> for RevolutedCurve<C>
impl<C: ParametricCurve3D + BoundedCurve> SearchNearestParameter<D2> for RevolutedCurve<C>
source§impl SearchNearestParameter<D2> for Sphere
impl SearchNearestParameter<D2> for Sphere
source§impl SearchParameter<D2> for BSplineSurface<Point2>
impl SearchParameter<D2> for BSplineSurface<Point2>
source§impl SearchParameter<D2> for BSplineSurface<Point3>
impl SearchParameter<D2> for BSplineSurface<Point3>
source§impl<C: ParametricCurve2D + BoundedCurve> SearchParameter<D2> for ExtrudedCurve<C, Vector2>
impl<C: ParametricCurve2D + BoundedCurve> SearchParameter<D2> for ExtrudedCurve<C, Vector2>
source§impl<C: ParametricCurve3D + BoundedCurve> SearchParameter<D2> for ExtrudedCurve<C, Vector3>
impl<C: ParametricCurve3D + BoundedCurve> SearchParameter<D2> for ExtrudedCurve<C, Vector3>
source§impl SearchParameter<D2> for NURBSSurface<Vector3>
impl SearchParameter<D2> for NURBSSurface<Vector3>
source§fn search_parameter<H: Into<SPHint2D>>(
&self,
point: Point2,
hint: H,
trials: usize
) -> Option<(f64, f64)>
fn search_parameter<H: Into<SPHint2D>>(
&self,
point: Point2,
hint: H,
trials: usize
) -> Option<(f64, f64)>
Search the parameter (u, v)
such that self.subs(u, v).rational_projection()
is near pt
.
If cannot find, then return None
.
Examples
use truck_geometry::*;
let knot_vec = KnotVec::uniform_knot(2, 2);
let ctrl_pts = vec![
vec![Vector3::new(0.0, 0.0, 1.0), Vector3::new(0.1, 0.0, 0.5), Vector3::new(0.5, 0.0, 0.3), Vector3::new(1.0, 0.0, 1.0)],
vec![Vector3::new(0.0, 0.1, 0.1), Vector3::new(0.2, 0.2, 0.1), Vector3::new(0.4, 0.3, 0.4), Vector3::new(1.0, 0.3, 0.7)],
vec![Vector3::new(0.0, 0.5, 0.4), Vector3::new(0.3, 0.6, 0.5), Vector3::new(0.6, 0.4, 1.0), Vector3::new(1.0, 0.5, 0.4)],
vec![Vector3::new(0.0, 1.0, 1.0), Vector3::new(0.1, 1.0, 1.0), Vector3::new(0.5, 1.0, 0.5), Vector3::new(1.0, 1.0, 0.3)],
];
let bspsurface = BSplineSurface::new((knot_vec.clone(), knot_vec), ctrl_pts);
let surface = NURBSSurface::new(bspsurface);
let pt = surface.subs(0.3, 0.7);
let (u, v) = surface.search_parameter(pt, Some((0.5, 0.5)), 100).unwrap();
assert_near!(surface.subs(u, v), pt);
source§impl SearchParameter<D2> for NURBSSurface<Vector4>
impl SearchParameter<D2> for NURBSSurface<Vector4>
source§fn search_parameter<H: Into<SPHint2D>>(
&self,
point: Point3,
hint: H,
trials: usize
) -> Option<(f64, f64)>
fn search_parameter<H: Into<SPHint2D>>(
&self,
point: Point3,
hint: H,
trials: usize
) -> Option<(f64, f64)>
Search the parameter (u, v)
such that self.subs(u, v).rational_projection()
is near pt
.
If cannot find, then return None
.
Examples
use truck_geometry::*;
let knot_vec = KnotVec::uniform_knot(2, 2);
let ctrl_pts = vec![
vec![Vector4::new(0.0, 0.0, 0.0, 1.0), Vector4::new(0.1, 0.0, 0.5, 0.4), Vector4::new(1.0, 0.0, 0.6, 2.0), Vector4::new(0.4, 0.0, 0.4, 0.4)],
vec![Vector4::new(0.0, 0.2, 0.2, 2.0), Vector4::new(0.24, 0.24, 0.1, 1.2), Vector4::new(2.4, 1.8, 2.4, 0.6), Vector4::new(1.4, 0.42, 0.98, 1.4)],
vec![Vector4::new(0.0, 1.5, 1.2, 3.0), Vector4::new(1.02, 2.04, 1.7, 3.4), Vector4::new(0.42, 0.28, 0.7, 0.7), Vector4::new(0.6, 0.3, 0.0, 0.6)],
vec![Vector4::new(0.0, 1.0, 1.0, 1.0), Vector4::new(0.2, 2.0, 2.0, 2.0), Vector4::new(0.85, 1.7, 0.85, 1.7), Vector4::new(1.0, 1.0, 0.3, 1.0)],
];
let bspsurface = BSplineSurface::new((knot_vec.clone(), knot_vec), ctrl_pts);
let surface = NURBSSurface::new(bspsurface);
let pt = surface.subs(0.3, 0.7);
let (u, v) = surface.search_parameter(pt, Some((0.5, 0.5)), 100).unwrap();
assert_near!(surface.subs(u, v), pt);