import type { MultiGeometryOptions, Gcp, Point } from '@allmaps/types';
/**
 * General Ground Control Point (GCP).
 * A GeneralGCP contains a mapping between a source and destination point.
 */
export type GeneralGcp = {
    source: Point;
    destination: Point;
};
export type DistortionMeasure = 'log2sigma' | 'twoOmega' | 'airyKavr' | 'signDetJ' | 'thetaa';
export type Distortions = {
    partialDerivativeX: Point;
    partialDerivativeY: Point;
    distortions: Map<DistortionMeasure, number>;
    distortion: number;
};
export type GeneralGcpAndDistortions = GeneralGcp & Partial<Distortions>;
export type GcpAndDistortions = Gcp & Partial<Distortions>;
/** Transformation type. */
export type TransformationType = 'straight' | 'helmert' | 'polynomial' | 'polynomial1' | 'polynomial2' | 'polynomial3' | 'thinPlateSpline' | 'projective' | 'linear';
export type GcpsInputs = {
    gcps: Gcp[];
};
export type TransformationTypeInputs = {
    transformationType: TransformationType;
};
export type GcpTransformerInputs = GcpsInputs & TransformationTypeInputs;
export type HelmertMeasures = {
    translation: Point;
    rotation: number;
    scale: number;
};
export type Polynomial1Measures = {
    translation: Point;
    rotation: number;
    scales: Point;
    shears: Point;
};
export type TransformationTypeMeasures = HelmertMeasures | Polynomial1Measures;
export type InverseOptions = {
    inverse: boolean;
};
export type RefinementOptions = {
    maxDepth: number;
    minSourceDistance: number;
    minDestinationDistance: number;
    minOffsetRatio: number;
    minOffsetDistance: number;
    sourceMidPointFunction: (p0: Point, p1: Point) => Point;
    destinationMidPointFunction: (p0: Point, p1: Point) => Point;
};
export type SplitGcpLinePointInfo = SplitGcpLineInfo & {
    sourceMidPoint: Point;
    destinationMidPointFromRefinementFunction: Point;
};
export type SplitGcpLineInfo = {
    destinationMidPointsDistance: number;
    destinationLineDistance: number;
};
export type GeneralGcpTransformOptions = {
    maxDepth: number;
    minSourceDistance: number;
    minDestinationDistance: number;
    minOffsetRatio: number;
    minOffsetDistance: number;
    distortionMeasures: DistortionMeasure[];
    referenceScale: number;
    preForward: ProjectionFunction;
    postForward: ProjectionFunction;
    preBackward: ProjectionFunction;
    postBackward: ProjectionFunction;
} & MultiGeometryOptions;
export type GcpTransformOptions = {
    maxDepth: number;
    minSourceDistance: number;
    minDestinationDistance: number;
    minOffsetRatio: number;
    minOffsetDistance: number;
    distortionMeasures: DistortionMeasure[];
    referenceScale: number;
    postToGeo: ProjectionFunction;
    preToResource: ProjectionFunction;
} & MultiGeometryOptions;
export type GeneralGcpTransformerOptions = {
    differentHandedness: boolean;
} & GeneralGcpTransformOptions;
export type GcpTransformerOptions = {
    differentHandedness: boolean;
} & GcpTransformOptions;
export type KernelFunction = (r: number, options: KernelFunctionOptions) => number;
export type KernelFunctionOptions = {
    derivative?: number;
    epsilon?: number;
};
export type NormFunction = (point0: Point, point1: Point) => number;
export type ProjectionFunction = (point: Point) => Point;
