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}