[Canvas学习]变形

学习目的:使用变形:移动,旋转,缩放栅格,创造出更强大的图形。

状态的保存与恢复Saving and restoring state

canvas的状态就是当前画面应用的所有样式和变形的一个快照,canvas的状态被存储在栈中,每当save方法被调用后,当前状态就会被推送到栈中保存。

状态信息包括:当前应用的变形; strokeStyle; fillStyle; globalAlpha; lineWidth; lineCap; lineJoin; miterLimit; shadowOffsetX; shadowOffsetY; shadowBlur; shadowColor; globalCompositeOperation; clipping path

save() 保存状态

restore() 恢复状态

每调用一次restore()方法后,上一个保存的状态就会从栈中弹出,所有设定都会被恢复。

var cvs = document.getElementById("canvas");

if(cvs.getContext){

  var ctx = cvs.getContext("2d");

  ctx.fillRect(0,0,150,150);

  ctx.save();

  ctx.fillStyle = "#09f";

  ctx.fillRect(15,15,120,120);

  ctx.save();

  ctx.fillStyle = "#fff";

  ctx.globalAlpha = 0.5;

  ctx.fillRect(30,30,90,90);

  ctx.restore();

  ctx.fillRect(45,45,60,60);

  ctx.restore();

  ctx.fillRect(60,60,30,30);

}

变形一: 移动Translating

translate(x, y) 移动canvas和它的原点

var cvs = document.getElementById("canvas");

if(cvs.getContext){

  var ctx = cvs.getContext("2d");

  ctx.fillRect(0,0,300,300);

  for(var i=0; i<3; i++){

    for(var j=0; j<3; j++){

      ctx.save();

      ctx.strokeStyle = "#9cff00";

      ctx.translate(500+100*j, 50+100*i);

      drawSpirograph(ctx, 20*(j+2)/(j+1), -8*(i+3)/(i+1), 10);

  ctx.restore();

    }

  }

}

function drawSpirograph(ctx, R, r, m){

  var x1 = R-m;

  var y1 = 0;

  var i = 1;

  ctx.beginPath();

  ctx.moveTo(x1, y1);

  do{

  if(i>20000) break;

  var x2 = (R+r)*Math.cos(Math.PI/72*i)-(r+m)*Math.cos((R+r)/r*(Math.PI/72*i));

  var y2 = (R+r)*Math.sin(Math.PI/72*i)-(r+m)*Math.sin((R+r)/r*(Math.PI/72*i));

  ctx.lineTo(x2, y2);

  x1 = x2;

  y1 = y2;

  i++;

}while( x2 != R-m && y2 != 0 );

  ctx.stroke();

}

变形二: 旋转Rotating

以原点为中心旋转canvas, 旋转中心点始终是canvas的原点,通过translate方法可以改变原点位置。

rotate(angle) 参数angle是旋转的角度,顺时针方向以弧度为单位值进行旋转

var cvs = document.getElementById("canvas");

if(cvs.getContext){

  var ctx = cvs.getContext("2d");

  ctx.translate(75,75); //移动canvas的坐标原点到图案的正中心点

  for(var i=1; i<6; i++){

    ctx.save(); //每一圈都有自己的canvas状态

    ctx.fillStyle = 'rgb(' + (51*i) +',' + (255-51*i) + ', 255)'; //每一圈的图案颜色是一致的

    var m = i*6;

    for(var j=0; j<m; j++){

      ctx.rotate(Math.PI*2/m);

      ctx.beginPath();

      ctx.arc(0, 12.5*i, 5, 0, Math.PI*2, true);

      ctx.fill();

    }

  }

}

变形三:缩放Scaling

scale(x, y)

x轴和y轴的缩放因子必须是正直, 大于1.0表示放大, 小于1.0表示缩小

本质

上述三种变形的原理都是使用矩阵来实现的

transform(m11, m12, m13, m22, dx, dy)

原文地址:https://www.cnblogs.com/joyjoe/p/6105576.html