1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//! Bezier surface trait definitions.
use crate::DType;
use crate::interpolate::error::InterpolateResult;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
/// A Bezier surface defined by a 2D grid of control points.
#[derive(Debug, Clone)]
pub struct BezierSurface<R: Runtime<DType = DType>> {
/// Control points, shape `[nu, nv, n_dims]`.
pub control_points: Tensor<R>,
/// Degree in u direction (nu - 1).
pub degree_u: usize,
/// Degree in v direction (nv - 1).
pub degree_v: usize,
}
/// Bezier surface algorithms.
pub trait BezierSurfaceAlgorithms<R: Runtime<DType = DType>> {
/// Evaluate the Bezier surface at parameter values (u, v) in [0, 1]^2.
///
/// # Arguments
/// * `u` - 1D tensor of u parameter values, shape `[m]`
/// * `v` - 1D tensor of v parameter values, shape `[m]`
///
/// # Returns
/// Points on the surface, shape `[m, n_dims]`
fn bezier_surface_evaluate(
&self,
surface: &BezierSurface<R>,
u: &Tensor<R>,
v: &Tensor<R>,
) -> InterpolateResult<Tensor<R>>;
/// Evaluate partial derivatives of the Bezier surface.
///
/// # Arguments
/// * `du` - Derivative order in u direction
/// * `dv` - Derivative order in v direction
fn bezier_surface_partial(
&self,
surface: &BezierSurface<R>,
u: &Tensor<R>,
v: &Tensor<R>,
du: usize,
dv: usize,
) -> InterpolateResult<Tensor<R>>;
/// Compute surface normals at parameter values (u, v).
fn bezier_surface_normal(
&self,
surface: &BezierSurface<R>,
u: &Tensor<R>,
v: &Tensor<R>,
) -> InterpolateResult<Tensor<R>>;
}