zoukankan      html  css  js  c++  java
  • [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)

  • 相关阅读:
    Azure HPC Pack Cluster添加辅助节点
    Azure HPC Pack 辅助节点模板配置
    Azure HPC Pack配置管理系列(PART6)
    Windows HPC Pack 2012 R2配置
    Azure HPC Pack 节点提升成域控制器
    Azure HPC Pack VM 节点创建和配置
    Azure HPC Pack 部署必要条件准备
    Azure HPC Pack 基础拓扑概述
    Azure VM 性能计数器配置
    Maven私仓配置
  • 原文地址:https://www.cnblogs.com/joyjoe/p/6105576.html
Copyright © 2011-2022 走看看