@thi.ng/morton
Version:
Z-order curve / Morton encoding, decoding & range extraction for arbitrary dimensions
109 lines • 4.15 kB
TypeScript
import type { NumericArray, Range1_32, Range1_64, RangeValueMap } from "@thi.ng/api";
export type Range2_64 = Exclude<Range1_64, 1>;
/**
* Z-Curve encoder/decoder and optimized bbox range extraction for
* arbitrary dimensions (>= 2). Supports max. 32bit per-component value
* range and resulting Morton codes encoded as `BigInt`.
*/
export declare class ZCurve<T extends Range2_64> {
/**
* Encodes a single nD point component as partial Z index.
*
* @param x - component value
* @param bits - bits per component
* @param dims - number of dimensions
* @param offset - bit offset (for curr dimension)
* @param out - existing partial Z result
*/
static encodeComponent(x: number, bits: number, dims: number, offset: number, out?: bigint): bigint;
/**
* Decodes a single nD component from given Z index.
*
* @param z - Z index
* @param bits - bits per component
* @param dims - number of dimensions
* @param offset - bit offset (for curr dimension)
*/
static decodeComponent(z: bigint, bits: number, dims: number, offset: number): number;
dim: T;
bits: number;
order: ArrayLike<number>;
masks: bigint[];
wipeMasks: bigint[];
/**
* @param dim - dimensions
* @param bits - number of bits per component
* @param order - component ordering
*/
constructor(dim: T, bits: Range1_32, order?: ArrayLike<RangeValueMap[T]>);
/**
* Encodes given nD point as Z index.
*
* @param p - point to encode
*/
encode(p: ArrayLike<number>): bigint;
/**
* Decodes given Z index into point coordinates.
*
* @param z - Z index
* @param out - optional result array
*/
decode(z: bigint, out?: NumericArray): NumericArray;
/**
* Decomposes given Z index into individual bit patterns, one per
* dimension.
*
* @remarks
*
*
* @param z -
* @param out -
*/
split(z: bigint, out?: bigint[]): bigint[];
merge(zparts: bigint[]): bigint;
/**
* Yields iterator of Z-curve indices in given nD bounding box.
*
* @remarks
* Uses {@link ZCurve.pointInBox} and {@link ZCurve.bigMin} to efficiently
* skip Z index sub-ranges outside the box.
*
* References:
* - https://en.wikipedia.org/wiki/Z-order_curve#Use_with_one-dimensional_data_structures_for_range_searching
* - https://aws.amazon.com/blogs/database/z-order-indexing-for-multifaceted-queries-in-amazon-dynamodb-part-1/
* - https://aws.amazon.com/blogs/database/z-order-indexing-for-multifaceted-queries-in-amazon-dynamodb-part-2/
*
* @param rmin - bbox min point
* @param rmax - bbox max point
*/
range(rmin: ArrayLike<number>, rmax: ArrayLike<number>): Generator<bigint, void, unknown>;
/**
* Computes the next valid Z index in bbox defined by `zmin` / `zmax` and
* greater than `zcurr`. Returns -1 if no further indices are in the box.
*
* @remarks
* Partially based on:
* https://github.com/statgen/LDServer/blob/develop/core/src/Morton.cpp#L38
*
* @param zcurr -
* @param zmin -
* @param zmax -
*/
bigMin(zcurr: bigint, zmin: bigint, zmax: bigint): bigint;
pointInBox(p: ArrayLike<number>, rmin: ArrayLike<number>, rmax: ArrayLike<number>): boolean;
protected initMasks(): void;
protected loadBits(mask: number, bitPos: number, z: bigint): bigint;
}
export declare class ZCurve2 extends ZCurve<2> {
constructor(bits: Range1_32, order?: ArrayLike<RangeValueMap[2]>);
encode(p: ArrayLike<number>): bigint;
decode(z: bigint, out?: NumericArray): NumericArray;
pointInBox(p: ArrayLike<number>, rmin: ArrayLike<number>, rmax: ArrayLike<number>): boolean;
}
export declare class ZCurve3 extends ZCurve<3> {
constructor(bits: Range1_32, order?: ArrayLike<RangeValueMap[3]>);
encode(p: ArrayLike<number>): bigint;
decode(z: bigint, out?: NumericArray): NumericArray;
pointInBox(p: ArrayLike<number>, rmin: ArrayLike<number>, rmax: ArrayLike<number>): boolean;
}
//# sourceMappingURL=zcurve.d.ts.map