<!DOCTYPE html>
<title>Simplex noise</title>
<style>
body, html { width: 100%; height: 100%; padding: 0; margin: 0; overflow: hidden; background: black; }
canvas { display: block; width: 1024px; height: 768px; margin: calc(50vh - 768px / 2) auto 0; border: 2px solid #333; }
</style>
<canvas></canvas>
<script src='simplex.js?8'></script>
<script>
var canvas = document.getElementsByTagName('canvas')[0];
canvas.width = 1024;
canvas.height = 768;

var ctx = canvas.getContext('2d');

var image = ctx.createImageData(canvas.width, canvas.height);
var data = image.data;

var simplex = new SimplexNoise

function paint(data, w, h, steps = 100, threshold = 0, inverse = false) {
  for (var x = 0; x < w; x++) {
    for (var y = 0; y < h; y++) {
      var value = simplex.noise(x / steps, y / steps);
      value = 128 - 128 * value;
      // value = Math.abs(256 * value);

      var cell = (x + y * w) * 4;
      if (threshold) value = value < threshold ? 0 : 255
      if (inverse) value = 255 - value
      data[cell] = value * x / y;  // red
      data[cell + 1] = value * y / x;  // green
      data[cell + 2] = 0;  // blue
      // data[cell] += Math.max(0, (25 - value) * 8);
      data[cell + 3] = 255; // alpha.
    }
  }
}

console.time('simplex canvas')
paint(data, 1024, 768, 100)
console.timeEnd('simplex canvas')

ctx.fillColor = 'black';
ctx.fillRect(0, 0, 100, 100);
ctx.putImageData(image, 0, 0);
</script>