UNPKG

tumult

Version:
78 lines (60 loc) 1.35 kB
'use strict' const { lerp, fade } = require('./math') function hashN (p, gs) { if (gs.length === 1) return p[gs[0]] return p[gs[0] + hashN(p, gs.slice(1))] } class VecN { constructor (R) { this.R = R } dot (R) { let val = 0 for (let i = 0; i < R.length; i++) { val += this.R[i] * R[i] } return val } } const gN = [] function generateGN (dim) { for (let i = 0; i < dim * 2; i++) { const vec = new Array(dim).fill(0) vec[i % dim] = i / dim >= 1 ? 1 : -1 gN[i] = new VecN(vec) } } function lerpN (ns, ds) { if (ds.length === 1) return lerp(ns[0], ns[1], fade(ds[0])) const ns1 = ns.slice(0, Math.floor(ns.length / 2)) const ns2 = ns.slice(Math.ceil(ns.length / 2)) return lerp( lerpN(ns1, ds.slice(0, ds.length - 1)), lerpN(ns2, ds.slice(0, ds.length - 1)), fade(ds[ds.length - 1]) ) } function getNs (p, dim, gs, ds) { const ns = [] if (gN.length === 0) { generateGN(dim) } for (let i = 0; i < (2 << (dim - 1)); i++) { const gsPerm = gs.slice() const dsPerm = ds.slice() let temp = i for (let j = 0; j < dim; j++) { if (temp & 1) { gsPerm[j] += 1 dsPerm[j] -= 1 } temp = temp >> 1 } ns[i] = gN[hashN(p, gsPerm) % gN.length].dot(dsPerm) } return ns } module.exports = { lerpN, getNs }