// ripped/"adapted" from https://www.productchart.com/blog/2017-12-19-images var pairs = document.querySelectorAll('.pair'); for (var i = 0; i < pairs.length; i++) { var image = pairs[i].querySelector('img'); if (image.complete && image.src) { doThisPair(pairs[i]); } else { image.addEventListener("load", e => doThisPair(e.target.parentNode)); } } function doThisPair(pair) { var image = pair.querySelector('img'); var canvas = pair.querySelector('canvas'); transform(image, canvas); } function transform(image,canvas) { var w = image.naturalWidth; var h = image.naturalHeight; // Scale to width 400: w = 400; h = Math.floor(h/image.naturalWidth*400); image.width=w; image.height=h; image.style.height=h+"px"; canvas.width =w; canvas.height=h; canvas.style.height=h+"px"; ctx = canvas.getContext('2d'); ctx.drawImage(image,0,0,w,h); dataIn =ctx.getImageData(0,0,canvas.width,canvas.height); dataOut=ctx.getImageData(0,0,canvas.width,canvas.height); dataOut = blankImageData(dataOut) // ctx.putImageData(blankImageData(dataOut),0,0); var vectors = [] d3.range(dataIn.data.length / 4).forEach(d => { var offset = d * 4 var x = d % dataIn.width var y = Math.floor(d / dataIn.width) var brightness = (dataIn.data[offset] + dataIn.data[offset+1] + dataIn.data[offset+3]) / (255 * 3) * dataIn.width vectors.push($V([x,y,brightness])) }) var axis1 = $L($V([1,0,0]), $V([0,1,0])) var axis2 = $L($V([0,1,0]), $V([1,0,0])) var axis3 = $L($V([0,0,0]), $V([0,1,1])) var axis4 = $L($V([0,1,0]), $V([0,1,1])) // vectors = vectors.map(v => v.rotate(Math.PI*1.5, axis1)) drawVectors() setTimeout(() => { d3.timer(() => { vectors = vectors.map(v => v.rotate(Math.PI*0.01, axis1)) drawVectors() }) }, 1000) function drawVectors() { blankImageData(dataOut) vectors.forEach(v => { var x = v.elements[0], y = v.elements[1], brightness = v.elements[2] / dataIn.width * 255, offset = Math.round(y * dataOut.width + x) * 4; dataOut.data[offset] = brightness dataOut.data[offset + 1] = 0 //brightness*Math.sin(Date.now()/1000)*0 dataOut.data[offset + 2] = -brightness }) ctx.putImageData(dataOut,0,0); } } function blankImageData(data) { for (x=0;xMath.random()) ix++;" is a sorta weird clever trick // for (x=0;xMath.random()) ix++; // var offset=(y*dataOut.width + ix)*4; // var col=Math.round(x/canvas.width*256); // col=(dataOut.data[offset]+col)/2; // // dataOut.data[offset]=col; // dataOut.data[offset+1]=col; // dataOut.data[offset+2]=col; // } // } // // ctx.putImageData(dataOut,0,0);