field.js
1.3 kB · javascript · 33 lines
1// FIELDS23function range(values) {4 let lo = Number.MAX_VALUE;5 let hi = -Number.MAX_VALUE;6 for (let i = 0; i < values.length; i++) {7 if (values[i] < lo) lo = values[i];8 if (values[i] > hi) hi = values[i];9 }10 return hi - lo < 1e-12 ? [lo, lo + 1] : [lo, hi];11}1213export function draw(pen, frame, width, height, values, ramp) {14 draw_range(pen, frame, width, height, values, range(values), ramp);15}1617export function draw_range(pen, frame, width, height, values, span, ramp) {18 if (width === 0 || height === 0 || values.length < width * height) return;19 const [lo, hi] = span;20 const reach = Math.abs(hi - lo) < 1e-12 ? 1 : hi - lo;21 const colors = new Uint8Array(width * height * 4);22 for (let i = 0; i < width * height; i++) colors.set(ramp.at((values[i] - lo) / reach), i * 4);23 pen.image(frame.x, frame.y, frame.w, frame.h, { shape: [height, width], colors });24}2526export function sample(pen, frame, resolution, f, ramp) {27 if (resolution === 0) return;28 const values = new Float64Array(resolution * resolution);29 for (let row = 0; row < resolution; row++) {30 for (let col = 0; col < resolution; col++) values[row * resolution + col] = f((col + 0.5) / resolution, (row + 0.5) / resolution);31 }32 draw(pen, frame, resolution, resolution, values, ramp);33}