WaterfallをcreateImageDataで

ウォーターフォール画像を描画するもう少し自然な方法は、createImageData, getImageData, putImageDataといったメソッドを使うことでしょうか。

index.html

<!doctype html>
<html>
<head>
<script src='/socket.io/socket.io.js'></script>
<script src="https://code.createjs.com/createjs-2015.11.26.min.js"></script>
<script>
var nxdata  = 32;
var nydata  = 32;
var myarray = Array(nxdata);
var mytable = Array(nxdata * nydata);
var socket  = io();
var canvas;
var ctx;
var imgData;

window.addEventListener("load", init);

function init() {
  console.log('init..');
  canvas = document.getElementById('myCanvas');
  ctx    = canvas.getContext('2d');

  if (canvas.getContext && canvas.getContext('2d').createImageData) {
    imgData = ctx.createImageData(512, 512);
    for (i = 0; i < 512; i++) {
      for (j = 0; j < 512; j++) {
        imgData.data[0 + j * 4 + i * imgData.width * 4] = j % 256;
        imgData.data[1 + j * 4 + i * imgData.width * 4] = (255 - (i % 256));
        imgData.data[2 + j * 4 + i * imgData.width * 4] =
            ((i / 2 + j / 2) % 256);
        imgData.data[3 + j * 4 + i * imgData.width * 4] = 255;
      }
    }
    ctx.putImageData(imgData, 0, 0);
  }
}

var count  = 0;
var marker = 0;
function emitParticles(myarray) {
  count++;
  if (count % 128 == 0) {
    marker = 255;
    count  = 0;
  } else {
    marker = 0;
  }
  for (j = 0; j < 512; j++) {
    imgData.data[0 + j * 4 + (512 - 1) * imgData.width * 4] = marker;
    imgData.data[1 + j * 4 + (512 - 1) * imgData.width * 4] = 0;
    imgData.data[2 + j * 4 + (512 - 1) * imgData.width * 4] =
        (32 * myarray[(j >> 3) % 10]) % 256;
    imgData.data[3 + j * 4 + (512 - 1) * imgData.width * 4] = 255;
  }

  for (i = 0; i < 512 - 1; i++) {
    for (j = 0; j < 512; j++) {
      for (k = 0; k < 4; k++) {
        imgData.data[k + j * 4 + i * imgData.width * 4] =
            imgData.data[k + j * 4 + (i + 1) * imgData.width * 4];
      }
    }
  }

  ctx.putImageData(imgData, 0, 0);
}

socket.on('time', function(data) {
  myarray = data.buffer;
  emitParticles(myarray);
});
</script>
</head>

<body>
    <canvas id="myCanvas" width="512" height="512" style="background:white;">
    </canvas>
    <p id='messages'></p>
</body>
</html>

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.