基于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二次贝塞尔曲线绘制鲜花
基于canvas二次贝塞尔曲线绘制鲜花的更多相关文章
- canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用
canvas中绘制二次贝塞尔曲线的方法为ctx.quadraticCurveTo(x1,y1,x2,y2); 四个参数分别为两个控制点的坐标.开始点即当前canvas中目前的点,如果想从指定的点开始, ...
- JavaScript+canvas 利用贝塞尔曲线绘制曲线
效果图: <body> <canvas id="test" width="800" height="300">< ...
- iOS:使用贝塞尔曲线绘制图表(折线图、柱状图、饼状图)
1.介绍: UIBezierPath :画贝塞尔曲线的path类 UIBezierPath定义 : 贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度. 曲线的定义有四个点:起始点 ...
- OpenGL 实践之贝塞尔曲线绘制
说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简 ...
- Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画
Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画 0.首先.先给出一张效果gif图. 1.贝塞尔曲线原理及相关公式參考:http://www.jianshu.com/p/c0d7ad79 ...
- iOS 使用贝塞尔曲线绘制路径
使用贝塞尔曲线绘制路径 大多数时候,我们在开发中使用的控件的边框是矩形,或者做一点圆角,是使得矩形的角看起来更加的圆滑. 但是如果我们想要一个不规则的图形怎么办?有人说,叫UI妹子做,不仅省事,还可以 ...
- n阶贝塞尔曲线绘制(C/C#)
原文:n阶贝塞尔曲线绘制(C/C#) 贝塞尔是很经典的东西,轮子应该有很多的.求n阶贝塞尔曲线用到了 德卡斯特里奥算法(De Casteljau's Algorithm) 需要拷贝代码请直接使用本文最 ...
- Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现
Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状. 一次Bezier曲线公式: 一次Bezier曲线是由P0至P1的连续点, ...
- canvas 绘制二次贝塞尔曲线
代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
随机推荐
- Linux中docker的使用二
容器下安装jdk和tomcat:通过挂载文件的方法,把宿主机上的文件挂载到容器中,然后解压到opt目录下:tar -zxvf 包名 -C /opt//opt目录下drwxr-xr-x 8 10 143 ...
- IDEA如何重置窗口布局
如何重置窗口布局 我不知道怎么搞的,左边的,上边的,下边的,视图都没有了 , 重启了一下,然后重置为默认视图,就好了
- mac install: /usr/bin/unrar: Operation not permitted
按照教程mac下解压缩rar文件工具-rarosx(免费),在mac上安装rar,在执行命令 sudo install -c -o $USER unrar /bin 出现错误:install: /bi ...
- 【java基础】Thread类之join方法
- luogu P5058 [ZJOI2004]嗅探器
题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大 ...
- poj3111 K Best 最大化平均值,二分
题目:http://poj.org/problem?id=3111 题意:给你n,k,n个数的v.w值,选出k个数,使得v之和/w之和最大化. 思路:一看到题目,这不是赤果果的贪心吗?为什么放在二分专 ...
- 洛谷 题解 P1287 【盒子与球】
题解:P1287 盒子与球 不了解的:stirling数(斯特林数) - 百度百科 分析如下: 设有n个不同的球,分别用b1,b2,--bn表示.从中取出一个球bn,bn的放法有以下两种: 1) bn ...
- enumerate用法总结
enumerate在字典上是枚举.列举的意思 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 enumerat ...
- 【简明翻译】Hibernate 5.4 Getting Started Guide 官方入门文档
前言 最近的精力主要集中在Hibernate上,在意识到Hibernate 5 的中文资料并不多的时候,我不得不把目光转向Hibernate的官方doc,学习之余简要翻一下入门文档. 原文地址:htt ...
- 如何用css画一个文件上传图案?
如下图,如果是你,你会怎么实现: 通常我们会通过字体图标来显示中间的加号,外层用一个div包裹即可:或者使用伪元素来模拟中间的一横一竖,这都比较麻烦. 其实我们可以直接使用div+css就可以实现. ...