import '../../../assert/js/assert.js';
import '../../../globals.js';
/**
 * Represents a face with a main (positive-oriented) boundary and zero or more (negative-oriented) holes.
 *
 * @author Jonathan Olson <jonathan.olson@colorado.edu>
 */
import Bounds2 from '../../../dot/js/Bounds2.js';
import Matrix3 from '../../../dot/js/Matrix3.js';
import { BigRational, ClippableFace, ClippableFaceAccumulator, RationalBoundary, RationalHalfEdge, RenderPath, RenderProgram, WindingMap } from '../imports.js';
export default class RationalFace {
    readonly boundary: RationalBoundary;
    readonly holes: RationalBoundary[];
    windingMapMap: Map<RationalFace, WindingMap>;
    windingMap: WindingMap | null;
    renderProgram: RenderProgram | null;
    processed: boolean;
    constructor(boundary: RationalBoundary);
    toAccumulator(accumulator: ClippableFaceAccumulator, matrix?: Matrix3): void;
    getEdges(): RationalHalfEdge[];
    getBounds(matrix: Matrix3): Bounds2;
    /**
     * Returns a set of render paths that are included in this face (based on winding numbers).
     *
     * REQUIRED: Should have computed the winding map first.
     */
    getIncludedRenderPaths(): Set<RenderPath>;
    static traceBoundaries(filteredRationalHalfEdges: RationalHalfEdge[], innerBoundaries: RationalBoundary[], outerBoundaries: RationalBoundary[], faces: RationalFace[]): RationalHalfEdge[];
    static computeFaceHolesWithOrderedWindingNumbers(outerBoundaries: RationalBoundary[], faces: RationalFace[]): RationalBoundary[];
    static computeFaceHoles(integerBounds: Bounds2, outerBoundaries: RationalBoundary[], faces: RationalFace[], faceHoleLog?: FaceHoleLog | null): RationalBoundary;
    static createUnboundedFace(...exteriorBoundaries: RationalBoundary[]): RationalFace;
    /**
     * Computes winding maps for all of the faces
     */
    static computeWindingMaps(filteredRationalHalfEdges: RationalHalfEdge[], unboundedFace: RationalFace): void;
    /**
     * Combines faces that have equivalent face data IFF they border each other (leaving separate programs with
     * equivalent face data separate if they don't border). It will also remove edges that border between faces
     * that we combine, and will connect edges to keep things polygonal!
     */
    static traceCombineFaces<FaceData, OutputFace, ClippableFaceType extends ClippableFace>(faces: RationalFace[], fromIntegerMatrix: Matrix3, getFaceData: (face: RationalFace) => FaceData, createOutputFace: (face: ClippableFaceType, faceData: FaceData, bounds: Bounds2) => OutputFace, isFaceDataCompatible: (faceData1: FaceData, faceData2: FaceData | null) => boolean, accumulator: ClippableFaceAccumulator<ClippableFaceType>): OutputFace[];
}
export type FaceHoleLog = {
    entries: FaceHoleLogEntry[];
};
export type FaceHoleLogEntry = {
    outerBoundary: RationalBoundary;
    maxIntersectionX?: BigRational;
    maxIntersectionEdge?: RationalHalfEdge | null;
    maxIntersectionIsVertex?: boolean;
    connectedFace?: RationalFace | null;
};
//# sourceMappingURL=RationalFace.d.ts.map