UNPKG

@thi.ng/distance

Version:

N-dimensional distance metrics & K-nearest neighborhoods for point queries

51 lines (50 loc) 1.35 kB
import { clamp0 } from "@thi.ng/math/interval"; import { DIST_SQ, DIST_SQ1, DIST_SQ2, DIST_SQ3 } from "./squared.js"; class Nearest { constructor(dist, target, radius = Infinity) { this.dist = dist; this.target = target; this.radius = clamp0(radius); this.reset(); } radius; _currR; value; reset() { this._currR = this.dist.to(this.radius); this.value = void 0; return this; } /** * Returns current nearest neighbor result tuple (`[dist, val]`) or * undefined, if no such result exists (yet). */ deref() { return this.value != void 0 ? [this._currR, this.value] : void 0; } includesDistance(d, eucledian = true) { return (eucledian ? this.dist.to(d) : d) <= this._currR; } includesPosition(pos) { return this.dist.metric(this.target, pos) < this._currR; } consider(pos, val) { const d = this.dist.metric(this.target, pos); if (d <= this._currR) { this._currR = d; this.value = val; } return d; } } const nearest = (p, r, dist = DIST_SQ) => new Nearest(dist, p, r); const nearest2 = (p, r, dist = DIST_SQ2) => new Nearest(dist, p, r); const nearest3 = (p, r, dist = DIST_SQ3) => new Nearest(dist, p, r); const nearestN = (p, r, dist = DIST_SQ1) => new Nearest(dist, p, r); export { Nearest, nearest, nearest2, nearest3, nearestN };