JavaScript, Canvas y Marte

Para aquellos de vosotros que querais entender como funciona la demo Mars Canvas de Mathieu 'p01' HENRI aquí os dejo el código 'des-minificado' con algún que otro comentario explicativo.
window.onload = function(){
  var canvas = document.getElementById('lienzo');
  var g = canvas.getContext('2d');
  var z = 9;
  function pasoAnim() {
      //El fotograma anterior se desplaza hacia abajo 1 pixel y su ancho se amplifica en un 5'6%
      g.drawImage(canvas,8,0,300-8,150-2,0,1,300,150);
      //Difuminación del fotograma anterior 
      g.fillStyle='rgba(10,0,39,0.1)';
      g.fillRect(0,0,300,150);
      //Avance del visor
      z+= 88;
      //Nuevo horizonte
      g.fillStyle='#740';
      for(var x=74;x>=0;x--) {
        //Proyección de la altura correspondiente a (x,z) en el mapa
        var y = 75+Math.sin(z+x/27+Math.sin(x/9)*Math.sin(z*2-x/15))*20;
        g.fillRect(x*4,y,6,2);
      }
  }
  setInterval(pasoAnim,10);
}
Descubrí esta curiosa demo gracias a anieto2k.com, uno de los mejores blogs sobre desarrollo web.

Aquí podeis ver en funcionamiento el código anterior con algún añadido: pulsando sobre la imagen podemos parar y reactivar la animación.



Por cierto, como curiosidad, si en Firefox os colocais sobre la animación y mediante el menú contextual vemos la imagen el navegador aplicará por nosotros el método toDataURL() de Canvas con lo que obtenemos un URI data:image/png;base64 que podemos ver en el campo URL del navegador.

Advertencia:
Parece que el Firefox 3.0.1 hay algún problema con la función drawImage cuando los rectangulos inicial y final no tienen las mismas dimensiones. Hay que actualizar el navegador.