资讯专栏INFORMATION COLUMN

canvas离屏、旋转效果实践——旋转的雪花

maochunguang / 2334人阅读

摘要:另外这里循环中用到了的旋转效果,所以我们可以很轻易的画出条有角度的线。效果见文章开头的效果展示链接

效果展示
理论基础——“常见的canvas优化——模糊问题、旋转效果”

用离屏canvas画基础部分

1、封装画线函数

function drawLine(ctx,x1,y1,x2,y2,color){
  ctx.save();
  ctx.beginPath();
  ctx.strokeStyle = color;
  ctx.lineTo(x1, y1);
  ctx.lineTo(x2, y2);
  ctx.stroke();
  ctx.restore();
}

2、画雪花的六条线

function canvasSingleSnow(snowSize){
  var singleSnow = document.createElement("canvas");
  var ctxSingle = singleSnow.getContext("2d");
  singleSnow.setAttribute("width", snowSize * 2);
  singleSnow.setAttribute("height", snowSize * 2);
  ctxSingle.translate(snowSize, snowSize);//定位原点到画布中心
  for(var i = 0; i < 6; i++){//画六条线
    ctxSingle.save();
    ctxSingle.rotate(Math.PI*2 * i/6);
    drawLine(ctxSingle, 0, 0, snowSize, 0,"#656565");
    ctxSingle.restore();
  }
  return singleSnow;
}

首先这里用到了离屏canvas,我们通过传参的方式确定离屏canvas的尺寸,是为了尽可能避免canvas图案缩放导致的显示效果问题。

另外这里for循环中用到了canvas的旋转效果,所以我们可以很轻易的画出6条有角度的线。效果如下图所示

3、画出完整的雪花

function drawCanvasSnow(centerSnow){
  var canvasSnow = document.createElement("canvas");
  var ctxSnow = canvasSnow.getContext("2d");
  canvasSnow.setAttribute("width", centerSnow * 2);
  canvasSnow.setAttribute("height", centerSnow * 2);
  //画一个大雪花
  var bigSnow = canvasSingleSnow(centerSnow);
  ctxSnow.drawImage(bigSnow, 0, 0, bigSnow.width, bigSnow.height,
    0, 0, centerSnow * 2, centerSnow * 2);
  //画六个小雪花
  var smallSnow = canvasSingleSnow(centerSnow/3);
  var sizeSnow = centerSnow * 3/5;//小雪花的尺寸(直径)
  var rSnow = centerSnow - sizeSnow/2;//小雪花的位置(离大雪花中心的距离)
  for(var i = 0; i < 6; i++){
    ctxSnow.save();
    ctxSnow.translate(centerSnow, centerSnow);
    ctxSnow.rotate(Math.PI*2 * i/6);
    ctxSnow.drawImage(smallSnow, 0, 0, smallSnow.width, smallSnow.height,
      rSnow - sizeSnow/2, -sizeSnow/2, sizeSnow, sizeSnow);
    ctxSnow.restore();
  }
  return canvasSnow;
}

上述代码中尺寸部分说明:小雪花的尺寸比大雪花小,用比例可以方便缩放;小雪花的位置则固定在大雪花六条线的端点处。效果如下图所示

将离屏canvas作为资源画到实际显示的canvas上

1、封装一个根据旋转加载离屏canvas的函数

//r为雪花图案中心距画布中心的距离
//angle为雪花图案在画布上的安放角度
//size为雪花图案的显示尺寸
function drawSnowAngle(ctx,r,angle,size){
  ctx.save();
  ctx.rotate(Math.PI*2 * angle);
  drawLine(ctx,0,0,r,0,"#656565");
  ctx.drawImage(canvasSnow, 0, 0, canvasSnow.width, canvasSnow.height,
    r - size/2, -size/2, size, size);
  ctx.restore();
}

2、可以将离屏canvas画的雪花图案画到实际显示的canvas上了

//center为实际显示canvas的画布中心(半径)
//rSnow为雪花图案的半径
drawSnowAngle(ctx, center - rSnow, i/snowNum, rSnow * 2);

3、加上动态旋转效果

var snowNum = 1;
var isAdd = true;
var loop = setInterval("drawCanvas()", 10);//定时器,每10ms绘制一次
function drawCanvas(){
  //设置旋转效果
  if(snowNum >= 18){isAdd = false;}//最大个数为18
  else if(snowNum <= 1){isAdd = true;}//最小个数为1
  if(isAdd){snowNum += snowNum/200;}//达到最大后开始递减
  else{snowNum -= snowNum/100;}//达到最少后开始递增
  //画图
  var rSnow = center/2 * (snowNum - 6)/6;//设置雪花图案显示尺寸
  canvasSnow = drawCanvasSnow(rSnow);//画出离屏雪花图案
  ctx.clearRect(-center, -center, center * 2, center * 2);//清除画布
  for(var i = 0; i < snowNum; i++){//开始画图
    drawSnowAngle(ctx, center - rSnow, i/snowNum, rSnow * 2);
  }
}

旋转的雪花就这样完成了。效果见文章开头的效果展示链接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82971.html

相关文章

  • 常见canvas优化——模糊问题、旋转效果

    摘要:常见优化方案模糊问题旋转效果离屏自定义图片尺寸实践离屏旋转效果实践旋转的雪花更新关于模糊问题前几天研究的时候刚好赶上作者发布新版本,发现新版本截屏出来的效果比我对旧版本处理后画布尺寸都设为倍的效果更好。 canvas常见优化方案——模糊问题、旋转效果、离屏、自定义图片尺寸 实践demo——canvas离屏、旋转效果实践——旋转的雪花 2017-12-18 16:27:35更新关于模糊问...

    jindong 评论0 收藏0
  • canvas入门里,你没注意到那些知识

    摘要:但需要注意的是,需在使用前调用。当然,你愿意的话也可以两者结合着用。绘制图像相信很多入门的,都看不到这个地方,不就是绘制图像的嘛,啊不准确,是绘制图形的。明确的说,是指围绕原点图像旋转弧度。 前言 本文写在七月底,进来不加班就整理了一下,一些非常基础的知识,对于canvas刚入门的人来说,值得阅读一下。 来个气势如虹的开头 与看各种文章相比,我更喜欢数学里的逻辑;与学习各种日新月异的框...

    tuniutech 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<