html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法


Posted in HTML / CSS onJanuary 09, 2013

前面的文章我已经讲了3种在canvas中画曲线的方法:arc,arcTo以及quadraticCurveTo.他们都有一个共同点,就是他们画的曲线都只能偏向一边,今天讲的bezierCurveTo与他们最大的不同点就是有两个控制点,即可以画出S形的曲线了。

bezierCurveTo,也就是所谓的贝赛尔曲线了,如果你学过某些画图工具,就能马上理解。
bezierCurveTo的语法如下
ctx.bezierCurveTo(x1,y1,x2,y2,x,y);他的参数我照例解释一下,其中的(x1,y1)即控制点1的坐标,(x2,y2)是控制点2的坐标,(x,y)是他的终点坐标。和quadraticCurveTo一样,他的起点坐标也是由moveTo预先设置好的。

所以,bezierCurveTo画出一条曲线需要4个点:起点,终点,控制点1,控制点2.为了后续讲解,这里我假定控制点1对应起点,控制点2对应终点
这里又要提到canvas画图的老问题了,就是代码画图全部靠猜,画到哪里你要刷新下才能明了。

我还是延续前面的优良传统,画一些辅助线来帮助大家理解:

复制代码
代码如下:

var x1=450, //控制点1的x坐标
y1 = 300, //控制点1的y
x2 = 450, //控制点2的x
y2 = 500,//控制点2的y
x = 300, //终点x
y = 500;//终点y
ctx.moveTo(300,300);//起点
ctx.beginPath();
ctx.lineWidth = 5;
ctx.strokeStyle = "rgba(0,0,0,1)"
ctx.moveTo(300,300);
ctx.bezierCurveTo(x1,y1,x2,y2,x,y);
ctx.stroke();
//开始画辅助线
ctx.beginPath();
ctx.strokeStyle = "rgba(255,0,0,0.5)";
ctx.lineWidth = 1;
// 连接起点和控制点1
ctx.moveTo(300,300);
ctx.lineTo(x1,y1);
// 连接终点和控制点2
ctx.moveTo(x2,y2);
ctx.lineTo(x,y);
// 连接起点与终点(基线)
ctx.moveTo(300,300);
ctx.lineTo(x,y);
ctx.stroke();

html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法


这里先画了一个类似quadraticCurveTo的曲线,只偏向一边。这条线显得比较“圆润”,是因为控制点1与2的x坐标是相同的。
现在再画一个S形的曲线,证明bezierCurveTo是与众不同的:
复制代码
代码如下:

var x1 = 150;
...

html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法


其实只要把控制点1的坐标变一下就行了。如果控制点1与控制点2的坐标分别处在基线的两边,则是画出S形的曲线;如果都在基线的某一边,则是类似于quadraticCurveTo的效果。
这个例子的情形比较简单,基线条(起点至终点)是竖直的,但实际应用中大部分时候我们的基线都是斜着的,那情况就复杂多了。不过大家自己试吧

每个画图的方法看起来功能都比较单一,但是,强大的方法是各个单一的方法组合出来的。后续的文章我试着讲解一些常规图形的画法,如圆角矩形,椭圆,他们就需要以前这些单一的方法结合起来。

HTML / CSS 相关文章推荐
CSS3+js实现简单的时钟特效
Mar 18 HTML / CSS
关于css兼容性问题及一些常见问题汇总
May 03 HTML / CSS
css3中flex布局宽度不生效的解决
Dec 09 HTML / CSS
HTML5地理定位与第三方工具百度地图的应用
Nov 17 HTML / CSS
HTML5 Canvas API中drawImage()方法的使用实例
Mar 25 HTML / CSS
HTML5 本地存储实现购物车功能
Sep 07 HTML / CSS
html5视频播放_动力节点Java学院整理
Jul 13 HTML / CSS
IE9下html5初试小刀
Sep 21 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
Jan 30 HTML / CSS
html5.2 dialog简介详解
Feb 27 HTML / CSS
前端H5 Video常见使用场景简介
Aug 21 HTML / CSS
CSS中实现动画效果-附案例
Feb 28 HTML / CSS
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
Jan 09 #HTML / CSS
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
Jan 09 #HTML / CSS
html5 Canvas画图教程(1)—画图的基本常识
Jan 09 #HTML / CSS
You might like
php adodb连接mssql解决乱码问题
2009/06/12 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
requireJS使用指南
2016/04/27 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
javascript实现时钟动画
2020/12/03 Javascript
python基础教程之自定义函数介绍
2014/08/29 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
《小池塘》教学反思
2014/02/28 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
后天观后感
2015/06/08 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python