import type { HomogeneousProjection, HomogeneousProjectionPointN, ProjectionFibreN } from './types.js'; export interface PerspectiveProjectionOptions { fromDim: number; /** * Distance from the projection viewpoint to the origin along each hidden * axis. Points at hidden coordinate 0 project at unit scale; points * nearer the viewpoint appear larger. Default 2. */ viewDistance?: number; /** Denominator clamp guarding the perspective divide. Default 1e-6. */ epsilon?: number; } /** * Iterated perspective projection ℝⁿ → ℝ³. * * Projects one dimension at a time (n → n−1 → … → 3): at each step the * highest remaining coordinate x_d becomes a depth, scaling the surviving * coordinates by viewDistance / (viewDistance − x_d). For n = 4 this is the * classic "tesseract" perspective; for n = 3 it is the identity. * * Points at or behind the viewpoint (x_d ≥ viewDistance) are clamped, not * clipped — geometry that crosses the viewpoint will distort. Proper 4D * frustum clipping is a planned, separate stage. */ export declare class PerspectiveProjection implements HomogeneousProjection { readonly fromDim: number; viewDistance: number; epsilon: number; constructor({ fromDim, viewDistance, epsilon }: PerspectiveProjectionOptions); projectPoint(p: ArrayLike): [number, number, number]; projectPositions(src: Float64Array, count: number, dst: Float32Array): void; /** * Row-major matrix for the unclamped projective chain. * * With one shared view distance the final denominator is * `q = 1 - sum(hiddenCoordinates) / viewDistance`. The validity report, * rather than final `q` alone, determines whether every intermediate divide * stays on this projective branch. */ homogeneousMatrix(): Float64Array; projectHomogeneousPoint(point: ArrayLike): HomogeneousProjectionPointN; projectHomogeneousPositions(src: Float64Array, count: number, dst: Float64Array, validity?: Uint8Array): void; /** * Exact affine fibre of the unclamped projective matrix, intersected with * the open validity half-space contributed by every perspective stage. */ inverseFibre(point: ArrayLike): ProjectionFibreN; private assertConfiguration; } //# sourceMappingURL=perspective.d.ts.map