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
TypeScript
/**
* 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;
}