Struct truck_geometry::nurbs::BSplineSurface[][src]

pub struct BSplineSurface<V> { /* fields omitted */ }
Expand description

B-spline surface

Examples

use truck_geometry::*;
const N : usize = 100; // sample size in test

// the knot vectors
let knot_vec0 = KnotVec::bezier_knot(3);
let knot_vec1 = KnotVec::from(
    vec![0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 1.0, 1.0, 1.0, 1.0]
);
let knot_vecs = (knot_vec0, knot_vec1);

// the control points
let mut v = vec![vec![Vector4::zero(); 7]; 4];
v[0][0] = Vector4::new(0.0, 0.0, 1.0, 1.0);
v[0][1] = &v[0][0] / 3.0;
v[0][2] = v[0][1].clone();
v[0][3] = v[0][0].clone();
v[0][4] = v[0][1].clone();
v[0][5] = v[0][1].clone();
v[0][6] = v[0][0].clone();
v[1][0] = Vector4::new(2.0, 0.0, 1.0, 1.0) / 3.0;
v[1][1] = Vector4::new(2.0, 4.0, 1.0, 1.0) / 9.0;
v[1][2] = Vector4::new(-2.0, 4.0, 1.0, 1.0) / 9.0;
v[1][3] = Vector4::new(-2.0, 0.0, 1.0, 1.0) / 3.0;
v[1][4] = Vector4::new(-2.0, -4.0, 1.0, 1.0) / 9.0;
v[1][5] = Vector4::new(2.0, -4.0, 1.0, 1.0) / 9.0;
v[1][6] = Vector4::new(2.0, 0.0, 1.0, 1.0) / 3.0;
v[2][0] = Vector4::new(2.0, 0.0, -1.0, 1.0) / 3.0;
v[2][1] = Vector4::new(2.0, 4.0, -1.0, 1.0) / 9.0;
v[2][2] = Vector4::new(-2.0, 4.0, -1.0, 1.0) / 9.0;
v[2][3] = Vector4::new(-2.0, 0.0, -1.0, 1.0) / 3.0;
v[2][4] = Vector4::new(-2.0, -4.0, -1.0, 1.0) / 9.0;
v[2][5] = Vector4::new(2.0, -4.0, -1.0, 1.0) / 9.0;
v[2][6] = Vector4::new(2.0, 0.0, -1.0, 1.0) / 3.0;
v[3][0] = Vector4::new(0.0, 0.0, -1.0, 1.0);
v[3][1] = &v[3][0] / 3.0;
v[3][2] = v[3][1].clone();
v[3][3] = v[3][0].clone();
v[3][4] = v[3][1].clone();
v[3][5] = v[3][1].clone();
v[3][6] = v[3][0].clone();

// cunstruct the B-spline curve
let bspline = BSplineSurface::new(knot_vecs, v);

// This B-spline curve is a nurbs representation of the unit sphere.
for i in 0..N {
    for j in 0..N {
        let u = 1.0 / (N as f64) * (i as f64);
        let v = 1.0 / (N as f64) * (j as f64);
        let v = bspline.subs(u, v); // We can use the instances as a function.
        let c = (v[0] / v[3]).powi(2) + (v[1] / v[3]).powi(2) + (v[2] / v[3]).powi(2);
        assert_near2!(c, 1.0);
    }
}

Implementations

constructor.

Arguments
  • knot_vecs - the knot vectors
  • control_points - the vector of the control points
Panics

There are 3 rules for construct B-spline curve.

  • The number of knots is more than the one of control points.
  • There exist at least two different knots.
  • There are at least one control point.

constructor.

Arguments
  • knot_vecs - the knot vectors
  • control_points - the vector of the control points
Failures

There are 3 rules for construct B-spline curve.

  • The number of knots is more than the one of control points.
  • There exist at least two different knots.
  • There are at least one control point.

constructor.

Arguments
  • knot_vecs - the knot vectors
  • control_points - the vector of the control points
Failures

This method is prepared only for performance-critical development and is not recommended.
This method does NOT check the 3 rules for constructing B-spline surface.
The programmer must guarantee these conditions before using this method.

constructor.

Arguments
  • knot_vecs - the knot vectors
  • control_points - the vector of the control points
Failures

This method checks the 3 rules for constructing B-spline surface in the debug mode.
The programmer must guarantee these conditions before using this method.

Returns the reference of the knot vectors

Returns the u knot vector.

Returns the v knot vector.

Returns the idxth u knot.

returns the idxth v knot.

Returns the reference of the vector of the control points

Returns the reference of the control point corresponding to the index (idx0, idx1).

Apply the given transformation to all control points.

Returns the iterator over the control points in the column_idxth row.

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::bezier_knot(1);
let vknot_vec = KnotVec::bezier_knot(2);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let mut iter = bspsurface.ctrl_pts_row_iter(1);
assert_eq!(iter.next(), Some(&Vector3::new(1.0, 0.0, 1.0)));
assert_eq!(iter.next(), Some(&Vector3::new(1.0, 1.0, 1.0)));
assert_eq!(iter.next(), None);

Returns the iterator over the control points in the row_idxth row.

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::bezier_knot(1);
let vknot_vec = KnotVec::bezier_knot(2);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let mut iter = bspsurface.ctrl_pts_column_iter(1);
assert_eq!(iter.next(), Some(&Vector3::new(0.0, 1.0, 0.0)));
assert_eq!(iter.next(), Some(&Vector3::new(1.0, 1.0, 1.0)));
assert_eq!(iter.next(), Some(&Vector3::new(2.0, 1.0, 2.0)));
assert_eq!(iter.next(), None);

Returns the mutable reference of the control point corresponding to index (idx0, idx1).

Returns the iterator on all control points

Returns the degrees of B-spline surface

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::from(vec![0.0, 0.0, 1.0, 1.0]);
let vknot_vec = KnotVec::from(vec![0.0, 0.0, 0.0, 1.0, 1.0, 1.0]);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
assert_eq!(bspsurface.udegree(), 1);

Returns the degrees of B-spline surface

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::from(vec![0.0, 0.0, 1.0, 1.0]);
let vknot_vec = KnotVec::from(vec![0.0, 0.0, 0.0, 1.0, 1.0, 1.0]);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
assert_eq!(bspsurface.vdegree(), 2);

Returns the degrees of B-spline surface

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::from(vec![0.0, 0.0, 1.0, 1.0]);
let vknot_vec = KnotVec::from(vec![0.0, 0.0, 0.0, 1.0, 1.0, 1.0]);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
assert_eq!(bspsurface.degrees(), (1, 2));

Returns whether the knot vectors are clamped or not.

Swaps two parameters.

Examples
use truck_geometry::*;
let knot_vecs0 = (KnotVec::bezier_knot(1), KnotVec::bezier_knot(2));
let ctrl_pts0 = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let mut bspsurface0 = BSplineSurface::new(knot_vecs0, ctrl_pts0);

let knot_vecs1 = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(1));
let ctrl_pts1 = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.0, 1.0)],
    vec![Vector2::new(0.5, -1.0), Vector2::new(0.5, 2.0)],
    vec![Vector2::new(1.0, 0.0), Vector2::new(1.0, 1.0)],
];
let mut bspsurface1 = BSplineSurface::new(knot_vecs1, ctrl_pts1);
assert_eq!(bspsurface0.swap_axes(), &bspsurface1);

The range of the parameter of the surface.

Creates the curve whose control points are the idxth column control points of self.

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::bezier_knot(1);
let vknot_vec = KnotVec::bezier_knot(2);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let bspcurve = bspsurface.column_curve(1);

assert_eq!(bspcurve.knot_vec(), &KnotVec::bezier_knot(2));
assert_eq!(
    bspcurve.control_points(),
    &vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
);

Creates the column sectional curve.

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::bezier_knot(1);
let vknot_vec = KnotVec::bezier_knot(2);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let bspcurve = bspsurface.row_curve(1);

assert_eq!(bspcurve.knot_vec(), &KnotVec::bezier_knot(1));
assert_eq!(
    bspcurve.control_points(),
    &vec![Vector3::new(1.0, 0.0, 1.0), Vector3::new(1.0, 1.0, 1.0)],
);

Returns the closure of substitution.

Calculate derived B-spline surface by the first parameter u.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(1), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let uderivation = bspsurface.uderivation();

// bspsurface: (v, 2v(1 - v)(2u - 1) + u), uderivation: (0.0, 4v(1 - v) + 1)
const N: usize = 100; // sample size
for i in 1..N {
    let u = (i as f64) / (N as f64);
    for j in 0..=N {
        let v = (j as f64) / (N as f64);
        assert_near2!(
            uderivation.subs(u, v),
            Vector2::new(0.0, 4.0 * v * (1.0 - v) + 1.0),
        );
    }
}

Calculate derived B-spline surface by the second parameter v.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(1), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let vderivation = bspsurface.vderivation();

// bspsurface: (v, 2v(1 - v)(2u - 1) + u), vderivation: (1, -2(2u - 1)(2v - 1))
const N: usize = 100; // sample size
for i in 0..=N {
    let u = (i as f64) / (N as f64);
    for j in 0..=N {
        let v = (j as f64) / (N as f64);
        assert_near2!(
            vderivation.subs(u, v),
            Vector2::new(1.0, -2.0 * (2.0 * u - 1.0) * (2.0 * v - 1.0)),
        );
    }
}

Returns whether all control points are same or not. If the knot vector is clamped, it means whether the curve is constant or not.

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::bezier_knot(1);
let vknot_vec = KnotVec::bezier_knot(2);
let pt = Vector2::new(1.0, 2.0);
let ctrl_pts = vec![
    vec![pt.clone(), pt.clone(), pt.clone()],
    vec![pt.clone(), pt.clone(), pt.clone()],
];
let mut bspsurface = BSplineSurface::new((uknot_vec, vknot_vec), ctrl_pts);
assert!(bspsurface.is_const());

*bspsurface.control_point_mut(1, 2) = Vector2::new(2.0, 3.0);
assert!(!bspsurface.is_const());
Remarks

If the knot vector is not clamped and the BSpline basis function is not partition of unity, then perhaps returns true even if the surface is not constant.

use truck_geometry::*;
let uknot_vec = KnotVec::uniform_knot(1, 5);
let vknot_vec = KnotVec::uniform_knot(1, 5);
let pt = Vector2::new(1.0, 2.0);
let ctrl_pts = vec![
    vec![pt.clone(), pt.clone(), pt.clone()],
    vec![pt.clone(), pt.clone(), pt.clone()],
];
let mut bspsurface = BSplineSurface::new((uknot_vec, vknot_vec), ctrl_pts);

// bspsurface is not constant.
assert_eq!(bspsurface.subs(0.0, 0.0), Vector2::new(0.0, 0.0));
assert_ne!(bspsurface.subs(0.5, 0.5), Vector2::new(0.0, 0.0));

// bspsurface.is_const() is true.
assert!(bspsurface.is_const());

Adds a knot x of the first parameter u, and do not change self as a surface.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(1), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();
bspsurface.add_uknot(0.0).add_uknot(0.3).add_uknot(0.5).add_uknot(1.0);
assert!(bspsurface.near2_as_surface(&org_surface));
assert_eq!(bspsurface.uknot_vec().len(), org_surface.uknot_vec().len() + 4);

add a knot x for the second parameter, and do not change self as a surface.
Return false if cannot add the knot, i.e.

  • the index of x will be lower than the degree, or
  • the index of x will be higher than the number of control points.
Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(1), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();
bspsurface.add_vknot(0.0).add_vknot(0.3).add_vknot(0.5).add_vknot(1.0);
assert!(bspsurface.near2_as_surface(&org_surface));
assert_eq!(bspsurface.vknot_vec().len(), org_surface.vknot_vec().len() + 4);

Removes the uknot corresponding to the indice idx, and do not change self as a curve.
If the knot cannot be removed, returns Error::CannotRemoveKnot.

Examples
use truck_geometry::*;
use errors::Error;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();

bspsurface.add_uknot(0.3).add_uknot(0.5);

assert!(bspsurface.try_remove_uknot(3).is_ok());
assert_eq!(bspsurface.try_remove_uknot(2), Err(Error::CannotRemoveKnot(2)));

assert_eq!(bspsurface.uknot_vec().len(), org_surface.uknot_vec().len() + 1);
assert!(bspsurface.near2_as_surface(&org_surface));

Removes the uknot corresponding to the indices idx, and do not change self as a curve. If cannot remove the knot, do not change self and return self.

Examples
use truck_geometry::*;
use errors::Error;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();

bspsurface.add_uknot(0.3).add_uknot(0.5);
bspsurface.remove_uknot(3).remove_uknot(3);

assert!(bspsurface.near2_as_surface(&org_surface));
assert_eq!(bspsurface.uknot_vec().len(), org_surface.uknot_vec().len())

Removes a vknot corresponding to the indice idx, and do not change self as a curve.
If the knot cannot be removed, returns Error::CannotRemoveKnot.

Examples
use truck_geometry::*;
use errors::Error;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();

bspsurface.add_vknot(0.3).add_vknot(0.5);
assert!(bspsurface.try_remove_vknot(3).is_ok());
assert_eq!(bspsurface.try_remove_vknot(2), Err(Error::CannotRemoveKnot(2)));

assert!(bspsurface.near2_as_surface(&org_surface));
assert_eq!(bspsurface.vknot_vec().len(), org_surface.vknot_vec().len() + 1);

Removes a uknot corresponding to the indices idx, and do not change self as a curve. If cannot remove the knot, do not change self and return self.

Examples
use truck_geometry::*;
use errors::Error;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();

bspsurface.add_vknot(0.3).add_vknot(0.5);
bspsurface.remove_vknot(3).remove_vknot(3);

assert!(bspsurface.near2_as_surface(&org_surface));
assert_eq!(bspsurface.vknot_vec().len(), org_surface.vknot_vec().len())

Elevates the vdegree.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();

bspsurface.elevate_vdegree();

assert_eq!(bspsurface.udegree(), org_surface.udegree());
assert_eq!(bspsurface.vdegree(), org_surface.vdegree() + 1);
assert!(bspsurface.near2_as_surface(&org_surface));

Elevates the udegree.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();

bspsurface.elevate_udegree();

assert_eq!(bspsurface.udegree(), org_surface.udegree() + 1);
assert_eq!(bspsurface.vdegree(), org_surface.vdegree());
assert!(bspsurface.near2_as_surface(&org_surface));

Aligns the udegree with the same degrees.

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::bezier_knot(1);
let vknot_vec = KnotVec::bezier_knot(2);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();

assert_ne!(bspsurface.udegree(), bspsurface.vdegree());
bspsurface.syncro_uvdegrees();
assert_eq!(bspsurface.udegree(), bspsurface.vdegree());
assert!(bspsurface.near2_as_surface(&org_surface));

Makes the uknot vector and the vknot vector the same knot vector.

Examples
use truck_geometry::*;
let uknot_vec = KnotVec::uniform_knot(1, 2);
let vknot_vec = KnotVec::bezier_knot(2);
let knot_vecs = (uknot_vec, vknot_vec);
let ctrl_pts = vec![
    vec![Vector3::new(0.0, 0.0, 0.0), Vector3::new(1.0, 0.0, 1.0), Vector3::new(2.0, 0.0, 2.0)],
    vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(1.0, 1.0, 1.0), Vector3::new(2.0, 1.0, 2.0)],
    vec![Vector3::new(0.0, 2.0, 0.0), Vector3::new(1.0, 2.0, 1.0), Vector3::new(2.0, 2.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let org_surface = bspsurface.clone();

assert_ne!(bspsurface.uknot_vec(), bspsurface.vknot_vec());
bspsurface.syncro_uvknots();
assert_eq!(bspsurface.uknot_vec(), bspsurface.vknot_vec());
assert!(bspsurface.near2_as_surface(&org_surface));

Cuts the surface into two surfaces at the parameter u

Examples
use truck_geometry::*;

let knot_vec0 = KnotVec::uniform_knot(2, 2);
let knot_vec1 = KnotVec::uniform_knot(2, 2);
let ctrl_pts0 = vec![
    Vector2::new(0.0, 0.0), Vector2::new(0.5, 0.0), Vector2::new(2.0, 0.0), Vector2::new(2.5, 0.0),
];
let ctrl_pts1 = vec![
    Vector2::new(0.0, 1.0), Vector2::new(0.5, 1.0), Vector2::new(2.0, 1.0), Vector2::new(2.5, 1.0),
];
let ctrl_pts2 = vec![
    Vector2::new(0.0, 1.5), Vector2::new(0.5, 1.5), Vector2::new(2.0, 1.5), Vector2::new(2.5, 1.5),
];
let ctrl_pts3 = vec![
    Vector2::new(0.0, 2.5), Vector2::new(0.5, 2.5), Vector2::new(2.0, 2.5), Vector2::new(2.5, 2.5),
];
let ctrl_pts = vec![ctrl_pts0, ctrl_pts1, ctrl_pts2, ctrl_pts3];
let bspsurface = BSplineSurface::new((knot_vec0, knot_vec1), ctrl_pts);

let mut part0 = bspsurface.clone();
let part1 = part0.ucut(0.68);
const N: usize = 100;
for i in 0..=N {
    for j in 0..=N {
        let u = 0.68 * (i as f64) / (N as f64);
        let v = 1.0 * (j as f64) / (N as f64);
        assert_near2!(bspsurface.subs(u, v), part0.subs(u, v));
    }
}
for i in 0..=N {
    for j in 0..=N {
        let u = 0.68 + 0.32 * (i as f64) / (N as f64);
        let v = 1.0 * (j as f64) / (N as f64);
        assert_near2!(bspsurface.subs(u, v), part1.subs(u, v));
    }
}

Cuts the curve to two curves at the parameter t

Examples
use truck_geometry::*;

let knot_vec0 = KnotVec::uniform_knot(2, 2);
let knot_vec1 = KnotVec::uniform_knot(2, 2);
let ctrl_pts0 = vec![
    Vector2::new(0.0, 0.0), Vector2::new(0.5, 0.0), Vector2::new(2.0, 0.0), Vector2::new(2.5, 0.0),
];
let ctrl_pts1 = vec![
    Vector2::new(0.0, 1.0), Vector2::new(0.5, 1.0), Vector2::new(2.0, 1.0), Vector2::new(2.5, 1.0),
];
let ctrl_pts2 = vec![
    Vector2::new(0.0, 1.5), Vector2::new(0.5, 1.5), Vector2::new(2.0, 1.5), Vector2::new(2.5, 1.5),
];
let ctrl_pts3 = vec![
    Vector2::new(0.0, 2.5), Vector2::new(0.5, 2.5), Vector2::new(2.0, 2.5), Vector2::new(2.5, 2.5),
];
let ctrl_pts = vec![ctrl_pts0, ctrl_pts1, ctrl_pts2, ctrl_pts3];
let bspsurface = BSplineSurface::new((knot_vec0, knot_vec1), ctrl_pts);

let mut part0 = bspsurface.clone();
let part1 = part0.vcut(0.68);
const N: usize = 100;
for i in 0..=N {
    for j in 0..=N {
        let u = 1.0 * (i as f64) / (N as f64);
        let v = 0.68 * (j as f64) / (N as f64);
        assert_near2!(bspsurface.subs(u, v), part0.subs(u, v));
    }
}
for i in 0..=N {
    for j in 0..=N {
        let u = 1.0 * (i as f64) / (N as f64);
        let v = 0.68 + 0.32 * (j as f64) / (N as f64);
        assert_near2!(bspsurface.subs(u, v), part1.subs(u, v));
    }
}

Creates a sectional curve with normalized knot vector from the parameter p to the parameter q.

Examples
use truck_geometry::*;

// a parabola surface: x = 2u - 1, y = 2v - 1, z = x^2 + y^z
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector3::new(-1.0, -1.0, 2.0), Vector3::new(-1.0, 0.0, 0.0), Vector3::new(-1.0, 1.0, 2.0)],
    vec![Vector3::new(0.0, -1.0, 0.0), Vector3::new(0.0, 0.0, -2.0), Vector3::new(0.0, 1.0, 0.0)],
    vec![Vector3::new(1.0, -1.0, 2.0), Vector3::new(1.0, 0.0, 0.0), Vector3::new(1.0, 1.0, 2.0)],
];
let mut bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);

// add some knots for the test!
bspsurface.add_uknot(0.26);
bspsurface.add_vknot(0.23);

let bnd_box = BoundingBox::from_iter(&[Vector2::new(0.2, 0.3), Vector2::new(0.8, 0.6)]);
let curve = bspsurface.sectional_curve(bnd_box);
const N: usize = 100;
assert_near2!(curve.subs(0.0), bspsurface.subs(0.2, 0.3));
assert_near2!(curve.subs(1.0), bspsurface.subs(0.8, 0.6));
for i in 0..=N {
    let t = i as f64 / N as f64;
    let pt = curve.subs(t);
    assert_near2!(pt[1], pt[0] * 0.5 - 0.1);
    assert_near2!(pt[2], pt[0] * pt[0] + pt[1] * pt[1]);
}

Creates a surface with normailized knot vectors connecting two curves.

Examples
use truck_geometry::*;
let knot_vec0 = KnotVec::bezier_knot(2);
let ctrl_pts0 = vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)];
let bspcurve0 = BSplineCurve::new(knot_vec0, ctrl_pts0);

let knot_vec1 = KnotVec::bezier_knot(2);
let ctrl_pts1 = vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, 1.0), Vector2::new(1.0, 2.0)];
let bspcurve1 = BSplineCurve::new(knot_vec1, ctrl_pts1);

let homotopy_surface = BSplineSurface::homotopy(bspcurve0, bspcurve1);
assert_eq!(
    homotopy_surface.control_points(),
    &vec![
        vec![Vector2::new(0.0, 0.0), Vector2::new(0.0, 2.0)],
        vec![Vector2::new(0.5, -1.0), Vector2::new(0.5, 1.0)],
        vec![Vector2::new(1.0, 0.0), Vector2::new(1.0, 2.0)],
    ],
);

Creats a surface by its boundary.

Examples
use truck_geometry::*;
let curve0 = BSplineCurve::new(
    KnotVec::bezier_knot(1),
    vec![Vector2::new(0.0, 0.0), Vector2::new(1.0, 0.0)],
);
let curve1 = BSplineCurve::new(
    KnotVec::bezier_knot(2),
    vec![Vector2::new(1.0, 0.0), Vector2::new(2.0, 0.5), Vector2::new(1.0, 1.0)],
);
let curve2 = BSplineCurve::new(
    KnotVec::bezier_knot(1),
    vec![Vector2::new(1.0, 1.0), Vector2::new(0.0, 1.0)],
);
let curve3 = BSplineCurve::new(
    KnotVec::bezier_knot(2),
    vec![Vector2::new(0.0, 1.0), Vector2::new(-1.0, 0.5), Vector2::new(0.0, 0.0)],
);
let surface = BSplineSurface::by_boundary(curve0, curve1, curve2, curve3);
assert_eq!(
    surface.control_points(),
    &vec![
        vec![Vector2::new(0.0, 0.0), Vector2::new(-1.0, 0.5), Vector2::new(0.0, 1.0)],
        vec![Vector2::new(1.0, 0.0), Vector2::new(2.0, 0.5), Vector2::new(1.0, 1.0)],
    ],
);
Remarks

If the end points of curves are not connected, curve1 and curve3 take precedence. i.e. curve1 and curve3 are contained in the boundary of the surface and curve0 and curve2 are not contained.

use truck_geometry::*;
let curve0 = BSplineCurve::new(
    KnotVec::bezier_knot(1),
    vec![Vector2::new(0.0, 0.0), Vector2::new(1.0, 0.0)],
);
let curve1 = BSplineCurve::new(
    KnotVec::bezier_knot(2),
    vec![Vector2::new(2.0, 0.0), Vector2::new(3.0, 0.5), Vector2::new(2.0, 1.0)],
);
let curve2 = BSplineCurve::new(
    KnotVec::bezier_knot(1),
    vec![Vector2::new(1.0, 1.0), Vector2::new(0.0, 1.0)],
);
let curve3 = BSplineCurve::new(
    KnotVec::bezier_knot(2),
    vec![Vector2::new(-1.0, 1.0), Vector2::new(-2.0, 0.5), Vector2::new(-1.0, 0.0)],
);
let surface = BSplineSurface::by_boundary(
    curve0.clone(),
    curve1.clone(),
    curve2.clone(),
    curve3.clone()
);
assert_ne!(surface.subs(0.0, 0.0), curve0.subs(0.0));
assert_eq!(surface.subs(0.0, 0.0), curve3.subs(1.0));

Normalizes the knot vectors

Translates the knot vectors.

Removes knots in order from the back

Get the boundary by four splitted curves.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(3), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 1.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 2.0)],
    vec![Vector2::new(0.0, 3.0), Vector2::new(0.5, 3.5), Vector2::new(1.0, 3.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);
let curves = bspsurface.splitted_boundary();
assert_eq!(
    curves[0].control_points(),
    &vec![Vector2::new(0.0, 0.0), Vector2::new(0.0, 1.0), Vector2::new(0.0, 2.0), Vector2::new(0.0, 3.0)],
);
assert_eq!(
    curves[1].control_points(),
    &vec![Vector2::new(0.0, 3.0), Vector2::new(0.5, 3.5), Vector2::new(1.0, 3.0)],
);
assert_eq!(
    curves[2].control_points(),
    &vec![Vector2::new(1.0, 3.0), Vector2::new(1.0, 2.0), Vector2::new(1.0, 1.0), Vector2::new(1.0, 0.0)],
);
assert_eq!(
    curves[3].control_points(),
    &vec![Vector2::new(1.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(0.0, 0.0)],
);

Extracts the boundary of surface

Determines whether self and other is near as the B-spline surfaces or not.

Divides each knot domain into the number of degree equal parts, and check |self(u, v) - other(u, v)| < TOLERANCE for each end points (u, v).

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(3), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 1.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 2.0)],
    vec![Vector2::new(0.0, 3.0), Vector2::new(0.5, 3.5), Vector2::new(1.0, 3.0)],
];
let bspsurface0 = BSplineSurface::new(knot_vecs, ctrl_pts);
let mut bspsurface1 = bspsurface0.clone();
assert!(bspsurface0.near_as_surface(&bspsurface1));

*bspsurface1.control_point_mut(1, 1) = Vector2::new(0.4, 1.0);
assert!(!bspsurface0.near_as_surface(&bspsurface1));

Determines whether self and other is near in square order as the B-spline surfaces or not.

Divides each knot domain into the number of degree equal parts, and check |self(u, v) - other(u, v)| < TOLERANCE for each end points (u, v).

Examples
use truck_geometry::*;
let eps = TOLERANCE;
let knot_vecs = (KnotVec::bezier_knot(3), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 1.0), Vector2::new(1.0, 1.0)],
    vec![Vector2::new(0.0, 2.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 2.0)],
    vec![Vector2::new(0.0, 3.0), Vector2::new(0.5, 3.5), Vector2::new(1.0, 3.0)],
];
let bspsurface0 = BSplineSurface::new(knot_vecs, ctrl_pts);
let mut bspsurface1 = bspsurface0.clone();
assert!(bspsurface0.near_as_surface(&bspsurface1));

*bspsurface1.control_point_mut(1, 1) += Vector2::new(eps, eps / 2.0);
assert!(bspsurface0.near_as_surface(&bspsurface1));
assert!(!bspsurface0.near2_as_surface(&bspsurface1));

Returns the bounding box including all control points.

Trait Implementations

The range of the parameter of the surface.

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Deserialize this value from the given Serde deserializer. Read more

Returns whether the curve curve is included in the surface self.

Returns whether the curve curve is included in the surface self.

Returns whether the curve curve is included in the surface self.

Inverts self

Returns the inverse.

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

The resulting type after applying the * operator.

Performs the * operation. Read more

Creates the surface division Read more

Substitutes to a B-spline surface.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(1), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);

// bspsurface: (v, 2v(1 - v)(2u - 1) + u)
const N: usize = 100; // sample size
for i in 0..=N {
    let u = (i as f64) / (N as f64);
    for j in 0..=N {
        let v = (j as f64) / (N as f64);
        assert_near2!(
            bspsurface.subs(u, v),
            Vector2::new(v, 2.0 * v * (1.0 - v) * (2.0 * u - 1.0) + u),
        );
    }
}

Substitutes derived B-spline surface by the first parameter u.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(1), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);

// bspsurface: (v, 2v(1 - v)(2u - 1) + u), uderivation: (0.0, 4v(1 - v) + 1)
const N: usize = 100; // sample size
for i in 0..=N {
    let u = (i as f64) / (N as f64);
    for j in 0..=N {
        let v = (j as f64) / (N as f64);
        assert_near2!(
            bspsurface.uder(u, v),
            Vector2::new(0.0, 4.0 * v * (1.0 - v) + 1.0),
        );
    }
}

Substitutes derived B-spline surface by the first parameter v.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(1), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);

// bspsurface: (v, 2v(1 - v)(2u - 1) + u), vderivation: (1, -2(2u - 1)(2v - 1))
const N: usize = 100; // sample size
for i in 0..=N {
    let u = (i as f64) / (N as f64);
    for j in 0..=N {
        let v = (j as f64) / (N as f64);
        assert_near2!(
            bspsurface.vder(u, v),
            Vector2::new(1.0, -2.0 * (2.0 * u - 1.0) * (2.0 * v - 1.0)),
        );
    }
}

Substitutes 2nd-ord derived B-spline surface by the first parameter u.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 0.5), Vector2::new(0.5, 1.0), Vector2::new(1.0, 0.5)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);

// bspsurface: (v, 2 u^2 v^2 - 2 u^2 v - 6 u v^2 + 6uv + 2v^2 + u - 2v)
// uuder: (0, 4v(v - 1))
const N: usize = 100; // sample size
for i in 0..=N {
    let u = (i as f64) / (N as f64);
    for j in 0..=N {
        let v = (j as f64) / (N as f64);
        assert_near2!(
            bspsurface.uuder(u, v),
            Vector2::new(0.0, 4.0 * v * (v - 1.0)),
        );
    }
}

Substitutes 2nd-ord derived B-spline surface by the second parameter v.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 0.5), Vector2::new(0.5, 1.0), Vector2::new(1.0, 0.5)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);

// bspsurface: (v, 2 u^2 v^2 - 2 u^2 v - 6 u v^2 + 6uv + 2v^2 + u - 2v)
// vvder: (0, 4(u^2 - 3u + 1))
const N: usize = 100; // sample size
for i in 0..=N {
    let u = (i as f64) / (N as f64);
    for j in 0..=N {
        let v = (j as f64) / (N as f64);
        assert_near2!(
            bspsurface.vvder(u, v),
            Vector2::new(0.0, 4.0 * (u * u - 3.0 * u + 1.0)),
        );
    }
}

Substitutes 2nd-ord derived B-spline surface by the both parameters u, v.

Examples
use truck_geometry::*;
let knot_vecs = (KnotVec::bezier_knot(2), KnotVec::bezier_knot(2));
let ctrl_pts = vec![
    vec![Vector2::new(0.0, 0.0), Vector2::new(0.5, -1.0), Vector2::new(1.0, 0.0)],
    vec![Vector2::new(0.0, 0.5), Vector2::new(0.5, 1.0), Vector2::new(1.0, 0.5)],
    vec![Vector2::new(0.0, 1.0), Vector2::new(0.5, 2.0), Vector2::new(1.0, 1.0)],
];
let bspsurface = BSplineSurface::new(knot_vecs, ctrl_pts);

// bspsurface: (v, 2 u^2 v^2 - 2 u^2 v - 6 u v^2 + 6uv + 2v^2 + u - 2v)
// uvder: (0, 8uv - 4u - 12v + 6)
const N: usize = 100; // sample size
for i in 0..=N {
    let u = (i as f64) / (N as f64);
    for j in 0..=N {
        let v = (j as f64) / (N as f64);
        assert_near2!(
            bspsurface.uvder(u, v),
            Vector2::new(0.0, 8.0 * u * v - 4.0 * u - 12.0 * v + 6.0),
        );
    }
}

The surface is in the space of Self::Point.

The derivation vector of the curve.

Returns the normal vector at (u, v).

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

point

curve => f64, surface => (f64, f64)

Search nearest parameter t such that self.subs(t) is nearest point.
Returns None if could not find such parameter. Read more

point

curve => f64, surface => (f64, f64)

Search parameter t such that self.subs(t) is near point.
Returns None if could not find such parameter. Read more

point

curve => f64, surface => (f64, f64)

Search parameter t such that self.subs(t) is near point.
Returns None if could not find such parameter. Read more

Serialize this value into the given Serde serializer. Read more

transform by trans.

transformed geometry by trans.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.