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. appium自动化的一个实例

    实现appium的自动化,三步走,具体如下: 第一步:启动appium的服务端: 可以通过命令行的方式启动:cmd,然后输入appium,如下图 也可以打开桌面程序appium,点击右上角的运行按钮, ...

  2. 成功build Maven但eclipse中依然显示该工程有错误

    在mac pro的控制台中,成功执行 mvn package,但该工程在eclipse仍然显示有错误. 解决办法:右键该工程 -> Maven -> Update project,勾选 F ...

  3. HTML_body中常用的标签部分

    meta: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  4. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  5. BZOJ 3106: [cqoi2013]棋盘游戏

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 859  Solved: 356[Submit][Status][Discuss] Descriptio ...

  6. HDU3666-THE MATRIX PROBLEM(差分约束-不等式解得存在性判断 对数转化)

    You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...

  7. 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  8. idea实现简单热部署

    首先我们打开设置tomcat的页面         

  9. Nginx(四)-- Nginx的扩展-OpenRestry

    1. OpenResty 安装及使用 OpenResty 是一个通过 Lua 扩展 Nginx 实现的可伸缩的 Web 平台,内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地 ...

  10. python学习-list

    # 数据类型之 列表 有顺序.# 关键字:list# 语法 :[] 数据之间用,隔开.列表当中的数据,可以是任意类型.数值是可以重复的.a = []b = ["魔王", " ...