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 相关文章推荐
网页布局中CSS样式无效的十个重要原因详解
Aug 10 HTML / CSS
CSS3教程(1):什么是CSS3
Apr 02 HTML / CSS
初探CSS3中的calc()功能
Jul 14 HTML / CSS
CSS3中的opacity属性使用教程
Aug 19 HTML / CSS
CSS3为背景图设置遮罩并解决遮罩样式继承问题
Jun 22 HTML / CSS
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
Jan 31 HTML / CSS
处理HTML5新标签的浏览器兼容版问题
Mar 13 HTML / CSS
HTML5中的websocket实现直播功能
May 21 HTML / CSS
html svg生成环形进度条的实现方法
Sep 23 HTML / CSS
HTML5表单验证特性(知识点小结)
Mar 10 HTML / CSS
HTML5在手机端实现视频全屏展示方法
Nov 23 HTML / CSS
HTML实现仿Windows桌面主题特效的实现
Jun 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 高性能书写
2010/12/11 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
php cli换行示例
2014/04/22 PHP
PHP图片水印类的封装
2017/07/06 PHP
javascript 播放器 控制
2007/01/22 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
保密工作目标责任书
2014/07/28 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
检讨书怎么写
2015/05/07 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技