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)

  • 相关阅读:
    zookeeper安装和使用
    一个最简单的Dubbo入门框架
    Dubbo Admin管理平台搭建
    Docker容器入门实践
    vue 项目安装 (入门)
    测试任何对象的某个特性是否存在 兼容js
    用户代理字符串检测呈现引擎、平台、Windows操作系统、移动设备和游戏系统 js
    React
    React (4) -- Conditional Rendering
    React (5) -- Lists and Keys
  • 原文地址:https://www.cnblogs.com/joyjoe/p/6105576.html
Copyright © 2011-2022 走看看