gaozhiqiang

基于canvas二次贝塞尔曲线绘制鲜花

canvas中二次贝塞尔曲线参数说明:

  • cp1x:控制点1横坐标
  • cp1y:控制点1纵坐标
  • x: 结束点1横坐标
  • y:结束点1纵坐标
  • cp2x:控制点2横坐标
  • cp2y:控制点2纵坐标
  • z:结束点2横坐标
  • y:结束点2纵坐标

示例效果图如下:

 

示例代码如下:

var canvas = document.getElementById(\'canvas\');
var ctx = canvas.getContext(\'2d\');
var width = 0;
var height = 0;
var centerX = 0;
var centerY = 0;
var num = 6;
var maxSize = 200;
var flowerBranch = 300;
var range = 0;
var rangeType = \'up\';
var grassNum = 1200;
var grassHeight = 50;
var grassArray = [];
var randomArray = [];
var petalArray = [];
getGrassArray();
draw();
function draw() {
      width = $(\'body\').innerWidth();
      height = $(\'body\').innerHeight();
      ctx.clearRect(0,0,width,height);
      centerX = width / 2 + range;
      centerY = height / 2 - flowerBranch / 2 + maxSize / 2 + Math.abs(range) / 5;
      canvas.width = width;
      canvas.height = height;
      drawFlowerBranch();
      drawFlowerSide();
      drawFlower(centerX,centerY,maxSize,\'#ff0000\');
      drawFlower(centerX,centerY,maxSize * 0.8,\'#000000\');
      drawFlower(centerX,centerY,maxSize * 0.6,\'#ccc\');
      drawFlowerCenter(maxSize * 0.2);
      drawGrass();
      if (range >= 20) {
          rangeType = \'down\';
        petalArray.push({
              type: \'right\',
              x: centerX,
              y: centerY,
              size: Math.random() * 100,
             color: \'rgb(\' + parseInt(Math.random() * 255) + \',\' + parseInt(Math.random() * 255) + \',\' + parseInt(Math.random() * 255) + \')\'
        });
     }
      if (range <= -20) {
          rangeType = \'up\';
        petalArray.push({
              type: \'left\',
              x: centerX,
              y: centerY,
              size: Math.random() * 100,
              color: \'rgb(\' + parseInt(Math.random() * 255) + \',\' + parseInt(Math.random() * 255) + \',\' + parseInt(Math.random() * 255) + \')\'
        });
    }
      if (rangeType == \'down\') {
          range -= 0.4;
    } else {
        range += 0.4;
       }
      requestAnimationFrame(draw);
}
function drawFlowerBranch () {
      ctx.beginPath();
      ctx.fillStyle = \'#b89909\';
      ctx.moveTo(centerX,centerY);
      ctx.quadraticCurveTo(centerX + 25, (height + centerY) / 2,width / 2,height);
      ctx.lineTo(width / 2 - 20,height);
      ctx.quadraticCurveTo(centerX + 5, (height + centerY) / 2,centerX,centerY);
      ctx.fill();
}
function drawFlowerSide() {
      var _petalArray = [];
      petalArray.forEach(function (item) {
        if (item.type == \'left\') {
            if (item.x > 0 || item.y < height) {
                  _petalArray.push(item)
            }
              item.x -= Math.random();
              item.y += Math.random();
              drawFlower(item.x,item.y,item.size,item.color);
        }
        if (item.type == \'right\') {
            if (item.x < width || item.y < height) {
                  _petalArray.push(item)
            }
              item.x += Math.random();
              item.y += Math.random();
              drawFlower(item.x,item.y,item.size,item.color);
        }
      })
      petalArray = _petalArray;
}
function drawFlower(centerX,centerY,size,color) {
      for(var i = 0; i < num; i ++) {
        drawPetal(centerX,centerY,360 / num * i,size,color);
      }
}
function drawPetal(centerX,centerY,deg,size,color) {
      ctx.save();
      ctx.translate(centerX,centerY);
      ctx.fillStyle = color;
      ctx.beginPath();
      ctx.moveTo(0,0);
      ctx.rotate(Math.PI / 180 * deg);
      ctx.quadraticCurveTo(size / 2, -size / 4, size, 0);
      ctx.quadraticCurveTo(size / 2, size / 4, 0, 0);
      ctx.fill();
      ctx.restore();
}
function drawFlowerCenter(size){
      ctx.beginPath();
      ctx.fillStyle = \'#edf01a\';
      ctx.moveTo(centerX,centerY);
      ctx.arc(centerX,centerY,size,0,Math.PI * 2);
      ctx.fill();
      for (var i = size - 5; i > 0; i -= 8) {
        ctx.beginPath();
        ctx.strokeStyle = \'#ff0000\';
        ctx.moveTo(centerX,centerY);
        ctx.setLineDash([1,10]);
        ctx.linCap = \'round\';
        ctx.arc(centerX,centerY,i,0,Math.PI * 2);
        ctx.stroke();
      }
}
function getGrassArray () {
      width = $(\'body\').innerWidth();
      for (var i = 0; i < grassNum; i ++) {
        grassArray.push(Math.random() * width);
        randomArray.push(Math.random() * 3);
      }
}
function drawGrass() {
      for (var i = 0; i < grassNum; i ++) {
        var random = randomArray[i];
        var grassX = grassArray[i];
        ctx.fillStyle = \'#0bad35\';
        ctx.beginPath();
        ctx.moveTo(grassX,height);
        ctx.quadraticCurveTo(grassX + 5 + range * 0.4, height - grassHeight * random / 2, grassX + range * 0.4, height - grassHeight * random);
        ctx.quadraticCurveTo(grassX + 3 + range * 0.4, height - grassHeight * random / 2, grassX - 3, height);
        ctx.fill();
      }
}

示例代码下载地址:基于canvas二次贝塞尔曲线绘制鲜花

分类:

技术点:

相关文章: