UNPKG

react-three-nurbs

Version:

A React component library for NURBS (Non-Uniform Rational B-Spline) curves, surfaces, and solids in Three.js. Built with React Three Fiber, zero external NURBS dependencies — all math implemented from scratch. Boolean operations powered by OpenCASCADE WAS

70 lines (69 loc) 2.6 kB
/** * NURBS curve evaluation and operations. * Implements algorithms from "The NURBS Book" (Piegl & Tiller), Chapters 3-5. */ import type { CurveData } from "./types"; export declare class NurbsCurve { private _degree; private _knots; private _controlPoints; private _weights; constructor(data: CurveData); static byKnotsControlPointsWeights(degree: number, knots: number[], controlPoints: number[][], weights: number[]): NurbsCurve; static byPoints(throughPoints: number[][], degree: number): NurbsCurve; /** * Evaluate curve point at parameter t (Algorithm A4.1). * Rational curve: C(t) = Σ R_i(t) * P_i where R_i = N_i*w_i / Σ N_j*w_j */ point(t: number): number[]; /** * Compute derivatives of the rational curve at parameter t. * Uses Algorithm A4.2 + Eq. 4.20 from The NURBS Book. * * Returns: derivatives[k] = kth derivative vector */ derivatives(t: number, numDerivs: number): number[][]; /** * Compute tangent vector (first derivative, NOT normalized) at parameter t. */ tangent(t: number): number[]; /** * Compute arc length using Gauss-Legendre quadrature. */ length(): number; private lengthBetween; /** * Find the parameter of the closest point on the curve to a given point. * Implements Algorithm A6.1 from "The NURBS Book" (Piegl & Tiller), Section 6.1. * * Phase 1: Initial guess via control polygon (Greville abscissa of closest control point) * + refinement by sampling within the support of that basis function. * Phase 2: Newton iteration with four convergence criteria: * (1) Point coincidence: ||C(t) - P|| < eps1 * (2) Zero cosine: |C'(t) · (C(t) - P)| / (|C'(t)| · |C(t) - P|) < eps2 * (3) Parameter correction: |Δt| · |C'(t)| < eps1 * (4) Domain bounds */ closestParam(point: number[]): number; closestPoint(point: number[]): number[]; /** * Divide curve into segments of equal arc length. * Returns array of { u, pt } where u is the parameter and pt is the 3D point. */ divideByEqualArcLength(divisions: number): Array<{ u: number; pt: number[]; }>; /** * Split curve at parameter t. * Inserts knot t until multiplicity = degree, then splits the data at that point. */ split(t: number): NurbsCurve[]; reverse(): NurbsCurve; clone(): NurbsCurve; degree(): number; knots(): number[]; controlPoints(): number[][]; weights(): number[]; asData(): CurveData; }