@thi.ng/distance
Version:
N-dimensional distance metrics & K-nearest neighborhoods for point queries
51 lines (50 loc) • 1.35 kB
JavaScript
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
};