UNPKG

@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
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 };