@thi.ng/poisson
Version:
nD Stratified grid and Poisson-disc sampling w/ support for spatial density functions and custom PRNGs
43 lines (42 loc) • 947 B
JavaScript
import { isNumber } from "@thi.ng/checks/is-number";
import { SYSTEM } from "@thi.ng/random/system";
import { jitter as _jitter } from "@thi.ng/vectors/jitter";
const samplePoisson = (_opts) => {
const opts = {
rnd: SYSTEM,
iter: 1,
jitter: 1,
quality: 500,
..._opts
};
const { points, index, rnd, jitter, quality, density: _d } = opts;
const density = isNumber(_d) ? () => _d : _d;
const iter = Math.max(opts.iter, 1);
const samples = [];
let failed = 0;
let pos;
let d;
let i;
outer: for (let num = opts.max; num > 0; ) {
pos = points(rnd);
d = density(pos);
i = iter;
while (i-- > 0) {
if (!index.has(pos, d)) {
index.add(pos, 0);
samples.push(pos);
failed = 0;
num--;
continue outer;
}
_jitter(null, pos, jitter, rnd);
}
if (++failed > quality) {
break;
}
}
return samples;
};
export {
samplePoisson
};