@thi.ng/vectors
Version:
Optimized 2d/3d/4d and arbitrary length vector operations, support for memory mapping/layouts
69 lines (68 loc) • 1.52 kB
JavaScript
import { implementsFunction } from "@thi.ng/checks/implements-function";
import { EPS } from "@thi.ng/math/api";
import { eqDelta as _eq } from "@thi.ng/math/eqdelta";
import { compileHOF } from "./compile/emit.js";
import { vop } from "./vop.js";
const $ = (dim) => eqDelta.add(
dim,
compileHOF(
dim,
[_eq, EPS],
([a, b]) => `eq(${a},${b},eps)`,
"eq,_eps",
"a,b,eps=_eps",
"a,b",
"",
"&&",
"return a.length === b.length && ",
";"
)
);
const eqDelta = vop();
eqDelta.default((v1, v2, eps = EPS) => {
if (implementsFunction(v1, "eqDelta")) {
return v1.eqDelta(v2, eps);
}
if (implementsFunction(v2, "eqDelta")) {
return v2.eqDelta(v1, eps);
}
return eqDeltaS(v1, v2, v1.length, eps);
});
const eqDelta2 = $(2);
const eqDelta3 = $(3);
const eqDelta4 = $(4);
const eqDeltaS = (a, b, n, eps = EPS, ia = 0, ib = 0, sa = 1, sb = 1) => {
for (; n > 0; n--, ia += sa, ib += sb) {
if (!_eq(a[ia], b[ib], eps)) {
return false;
}
}
return true;
};
const eqDeltaArray = (a, b, eps = EPS) => {
if (a === b) return true;
if (a.length !== b.length) return false;
for (let i = a.length; i-- > 0; ) {
if (!eqDelta(a[i], b[i], eps)) {
return false;
}
}
return true;
};
const isInArray = (p, pts, eps = EPS) => {
for (let i = pts.length; i-- > 0; ) {
if (eqDelta(p, pts[i], eps)) {
return true;
}
}
return false;
};
export {
eqDelta,
eqDelta2,
eqDelta3,
eqDelta4,
eqDeltaArray,
eqDeltaS,
isInArray
};