zoukankan      html  css  js  c++  java
  • 基于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二次贝塞尔曲线绘制鲜花

  • 相关阅读:
    实现简单高效的网址(文本)缩短服务
    Xsl模板应用基础(三、模板嵌套)
    Xsl模板应用基础(二、程序转换)
    Xsl模板应用基础(一、介绍)
    C#调用360杀毒软件查杀指定路径
    微信公众平台网页授权获取用户基本信息(VS.NET版)
    微信公众平台开发者模式自动回复功能与自定义菜单
    微信公众平台接入
    Git常用操作整理
    JVM知识点总结(一)——运行时数据区
  • 原文地址:https://www.cnblogs.com/gaozhiqiang/p/11845418.html
Copyright © 2011-2022 走看看