Skip to main content

OffsetEvaluator

Struct OffsetEvaluator 

Source
pub struct OffsetEvaluator<'a> { /* private fields */ }
Expand description

The pointwise offset evaluator, bound to one carrier and one orientation convention.

Construction is free — it stores three references and reads nothing — so a caller inside a Newton loop may build one per call without paying anything. site is a short stable label used only by offset_normal_diagnostic.

Implementations§

Source§

impl<'a> OffsetEvaluator<'a>

Source

pub fn new( site: &'static str, surface: &'a NurbsSurface, convention: OffsetNormal, ) -> Self

Source

pub fn normal(&self, u: f64, v: f64) -> Result<Vec3, String>

The unit normal alone, for callers that only need the direction (a residual check, or an affine offset that shifts the whole control net by one vector). Evaluates the point only on the lanes that need it.

Source

pub fn on_real_carrier( &self, u: f64, v: f64, tolerance: f64, ) -> Result<bool, String>

Whether the carrier evaluated at (u, v) is the REAL surface, or its fiction — the question Self::at cannot answer for itself.

OffsetNormal::Raw evaluates through deriv1_extended, which continues an OPEN direction along its boundary tangent plane without bound instead of refusing. A solve with no solution on the real carrier therefore converges on that continuation and reports a residual of zero, because the extended point IS a genuine root of the extended system. Callers must ask here, at convergence.

Being outside the domain is NOT by itself the fault, and testing for that alone over-refuses badly. Three cases:

  • a CLOSED direction wraps (rem_euclid) back onto the real surface, so it is always faithful — which is why a full cylinder cannot exhibit the problem and a trimmed arc can;
  • an open direction along which the surface is RULED extends exactly. A plane is a bounded bilinear patch in this kernel, and its continuation is still that plane; a cylinder’s axial direction continues as the same cylinder. A re-entrant corner touching a wall’s carrier beyond its patch is real geometry and must keep working;
  • an open direction with non-zero NORMAL CURVATURE is where the ruled continuation leaves the surface, and that is the fiction.

So the test is geometric, not a domain comparison and not keyed on NurbsSurface::analytic — an analytic-keyed guard silently no-ops on every fitted patch. The ruled extension drops the second-order term, so over an excursion d it departs the true surface by about ½·d²·|S_ii·n|, where S_ii·n is the second-fundamental-form coefficient along the exceeded direction (Golovanov §4.12’s b11/b22, the same quantities the marcher’s step budget uses). Faithful when that departure is within tolerance.

The bound is QUADRATIC in the excursion, so a parameter a rounding bit past the boundary is faithful by many orders and a real excursion onto a curved carrier is unfaithful by many orders. The exact threshold barely matters; passing the caller’s own convergence bar keeps the answer honest to the accuracy it claims.

Source

pub fn at(&self, u: f64, v: f64, distance: f64) -> Result<OffsetSample, String>

The offset of this carrier at (u, v) by distance along the normal (see the module’s sign convention).

Trait Implementations§

Source§

impl<'a> Clone for OffsetEvaluator<'a>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Copy for OffsetEvaluator<'a>

Auto Trait Implementations§

§

impl<'a> !RefUnwindSafe for OffsetEvaluator<'a>

§

impl<'a> !Send for OffsetEvaluator<'a>

§

impl<'a> !Sync for OffsetEvaluator<'a>

§

impl<'a> !UnwindSafe for OffsetEvaluator<'a>

§

impl<'a> Forget for OffsetEvaluator<'a>

§

impl<'a> Freeze for OffsetEvaluator<'a>

§

impl<'a> Unpin for OffsetEvaluator<'a>

§

impl<'a> UnsafeUnpin for OffsetEvaluator<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

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

fn clone_into(&self, target: &mut T)

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

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<S, T> Upcast<T> for S
where T: UpcastFrom<S> + ?Sized, S: ?Sized,

Source§

fn upcast(&self) -> &T
where Self: ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider ref type within the Wasm bindgen generics type system. Read more
Source§

fn upcast_into(self) -> T
where Self: Sized + ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider type within the Wasm bindgen generics type system. Read more