基于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 ...
随机推荐
- [学习笔记] [数据分析] 01.Python入门
1.安装Python与环境配置 ① ② 安装pip以及利用pip安装Python库 2.Anaconda安装 conda list 要在root环境下 3.常用数据分析库 ① Numpy 安装:con ...
- mac安装numpy,scipy,matplotlib
SaintKings-Mac-mini:~ saintking$ python Python ( , ::) [GCC Compatible Apple LLVM (clang-)] on dar ...
- 谷歌地图 API 开发之获取坐标以及街道详情
自己的项目中有获取当前点击的坐标经纬度或者获取当前街道的信息的需求.估计这个对于新手来说,还是比较麻烦的,因为从官网上找这个也并不是很好找,要找好久的,运气好的可能会一下子找到. 献上自己写的测试案例 ...
- jQuery中带有异步Ajax代码的执行顺序
1.问题 在使用jQuery的时候想通过Ajax请求来放所需要的html代码中放值,但是请求回来却是空的,源代码如下: $("a").click(function() { // ...
- OCR文字识别在计算机视觉的重要性、基本技术和最新进展
[摘要] 主要是文字检测和文字识别作为计算机视觉一部分的重要性,基本知识,面临的挑战,以及部分最新的成果. 人类认识了解世界的信息中91%来自视觉,同样计算机视觉成为机器认知世界的基础,也是人工智能研 ...
- PyTorch最佳实践,怎样才能写出一手风格优美的代码
[摘要] PyTorch是最优秀的深度学习框架之一,它简单优雅,非常适合入门.本文将介绍PyTorch的最佳实践和代码风格都是怎样的. 虽然这是一个非官方的 PyTorch 指南,但本文总结了一年多使 ...
- spring redis学习笔记
1.下载: https://github.com/MicrosoftArchive/redis/releases,并解压文件; 2.双击redis-server.exe,运行redis服务器; 3.双 ...
- luogu P1807 最长路_NOI导刊2010提高(07)
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 ...
- 移动开发在路上-- IOS移动开发系列 多线程三
这一次说一点概念性的东西,也是为后边做一些基础 HTTP协议的基本概念 http协议的基本概念 全称“超文本传输协议”,浏览器和服务器之间的通信规则 HTTp协议永远都是客户端发起的请求,服务器回送响 ...
- [TimLinux] Python3.6 异常继承关系
Python3.6 异常继承结构 object └── BaseException ├── Exception │ ├── ArithmeticError │ │ ├── Floating ...