import { CellComplex } from '../geometry/cell-complex.js'; export interface DuoprismOptions { /** Vertex count of the first polygon (xy plane), ≥ 3. */ p: number; /** Vertex count of the second polygon (zw plane), ≥ 3. */ q: number; /** Circumradius of the p-gon. Default 1. */ radius1?: number; /** Circumradius of the q-gon. Default 1. */ radius2?: number; } /** * Builds the p,q-duoprism: the Cartesian product of two regular polygons, * one in the xy plane and one in the zw plane — the simplest uniform (but * not regular) polychoron family, and inherently 4D: no lower-dimensional * analogue is a product of two polygons. * * Structure: p·q vertices, 2pq edges, pq square faces (plus the polygon * faces of the prisms), and p + q prismatic cells — q p-gonal prisms and * p q-gonal prisms. Every vertex lies on the Clifford torus of radii * (radius1, radius2). The 4,4-duoprism with equal radii is a tesseract. * * Cells are decomposed into 6(pq − p − q) tetrahedra without helper * vertices (polygon fan × prism staircase), so the complex is sliceable. * * Only the pq squares are authored as 2-cells: a group carries one * `verticesPerCell`, so p-gons and q-gons cannot share the quad group. * The polygon faces are present in the tetrahedralization rather than as * cells of their own, which is why `cellCount(2)` reports pq and not the * polytope's full face count. * * @param options - Polygon orders and the two factor circumradii. * * @example * The 6,6-duoprism. The turn has to mix the two factors to show anything: * a rotation inside the xy or the zw plane alone is a symmetry of one * polygon, so the figure would slide within its own silhouette. Coupling * y to z instead trades the factors against each other, and the two * hexagonal rings visibly exchange roles: * ```ts * const duoprism = new ProjectedEdges3D( * createDuoprism({ p: 6, q: 6 }), * new PerspectiveProjection({ fromDim: 4, viewDistance: 4 }) * ); * scene.add(duoprism.object); * * onFrame((t) => * duoprism.update( * new TransformN(4, rotationFromPlanes(4, [{ i: 1, j: 2, angle: t * 0.4 }])) * ) * ); * ``` * * @example * Taking both polygons square gives the tesseract's vertices and edges: * ```ts * const square = createDuoprism({ p: 4, q: 4 }); * const tesseract = createHypercube({ dim: 4 }); * square.vertexCount === tesseract.vertexCount; // true — 16 * square.cellCount(1) === tesseract.cellCount(1); // true — 32 * ``` */ export declare function createDuoprism(options: DuoprismOptions): CellComplex; //# sourceMappingURL=duoprism.d.ts.map