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