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二次贝塞尔曲线绘制鲜花

基于canvas二次贝塞尔曲线绘制鲜花的更多相关文章

  1. canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用

    canvas中绘制二次贝塞尔曲线的方法为ctx.quadraticCurveTo(x1,y1,x2,y2); 四个参数分别为两个控制点的坐标.开始点即当前canvas中目前的点,如果想从指定的点开始, ...

  2. JavaScript+canvas 利用贝塞尔曲线绘制曲线

    效果图: <body> <canvas id="test" width="800" height="300">< ...

  3. iOS:使用贝塞尔曲线绘制图表(折线图、柱状图、饼状图)

    1.介绍: UIBezierPath :画贝塞尔曲线的path类 UIBezierPath定义 : 贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度. 曲线的定义有四个点:起始点 ...

  4. OpenGL 实践之贝塞尔曲线绘制

    说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简 ...

  5. Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画

    Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画 0.首先.先给出一张效果gif图. 1.贝塞尔曲线原理及相关公式參考:http://www.jianshu.com/p/c0d7ad79 ...

  6. iOS 使用贝塞尔曲线绘制路径

    使用贝塞尔曲线绘制路径 大多数时候,我们在开发中使用的控件的边框是矩形,或者做一点圆角,是使得矩形的角看起来更加的圆滑. 但是如果我们想要一个不规则的图形怎么办?有人说,叫UI妹子做,不仅省事,还可以 ...

  7. n阶贝塞尔曲线绘制(C/C#)

    原文:n阶贝塞尔曲线绘制(C/C#) 贝塞尔是很经典的东西,轮子应该有很多的.求n阶贝塞尔曲线用到了 德卡斯特里奥算法(De Casteljau's Algorithm) 需要拷贝代码请直接使用本文最 ...

  8. Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现

    Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状. 一次Bezier曲线公式: 一次Bezier曲线是由P0至P1的连续点, ...

  9. canvas 绘制二次贝塞尔曲线

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

随机推荐

  1. linux虚拟机中FTP匿名访问模式介绍与配置

    FTP分3种访问模式,分别是:匿名访问模式,本地用户模式及虚拟用户模式 匿名访问是一种最不安全的验证模式,任何人都可以无需密码验证就登陆到FTP服务端主机,这 种模式一般只用来保存不重要的公开文件,尤 ...

  2. 【JMX】jmx结合jmx_exporter实现promethues监控

    JMX JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理.监控正在运行中的Java程序.常用于管理线程,内存,日志Lev ...

  3. Scrapy+eChart自动爬取生成网络安全词云

    因为工作的原因,近期笔者开始持续关注一些安全咨询网站,一来是多了解业界安全咨询提升自身安全知识,二来也是需要从各类安全网站上收集漏洞情报. 作为安全情报领域的新手,面对大量的安全咨询,多少还是会感觉无 ...

  4. 写一个umi插件 自动生成代码 解放cv的双手

    引言 最近在写一个中台项目,使用的react的umi框架. 各种增删改查.基本是列表页 新建页 详情页这种页面 为了避免不必要的简单重复(主要是想偷懒) 于是想去实现自己的一个代码生成器 探索 首先, ...

  5. ceph分布式存储

    存储分类: DAS:直连存储    ide线  sata线   usd线   sas线 NAS:网络附加存储   nfs   samba   ftp SAN:存储区域网络      issci SDS ...

  6. JSP + Session Cookie详解

    篇幅较大,对JSP进行了非常详细的讲解,并解释了Session和Cookie的实现原理 ,预计看完需要20分钟左右,慢慢享受吧 JSP概述 掌握了servlet后,就可以利用servlet来开发动态页 ...

  7. 【权限管理系统】Spring security(三)---认证过程(原理解析,demo)

      在前面两节Spring security (一)架构框架-Component.Service.Filter分析和Spring Security(二)--WebSecurityConfigurer配 ...

  8. 淘宝适配 flexible.js

    1.引入 阿里cdm文件,也可以自己下载下来引用,不需要在添加<meta name="viewport"">标签了 <script src=" ...

  9. [TimLinux] Linux shell获取进程pid

    调用脚本时,获取进程PID: (/this/is/a/script/file.sh > /out/to/log.txt & echo $!) & 脚本内部,获取进程PID: ec ...

  10. Codeforces Round #605 (Div. 3) E - Nearest Opposite Parity

    题目链接:http://codeforces.com/contest/1272/problem/E 题意:给定n,给定n个数a[i],对每个数输出d[i]. 对于每个i,可以移动到i+a[i]和i-a ...