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盒子模型详解
Apr 24 HTML / CSS
css3实现图片遮罩效果鼠标hover以后出现文字
Nov 05 HTML / CSS
使用CSS3配合IE滤镜实现渐变和投影的效果
Sep 06 HTML / CSS
CSS3 Calc实现滚动条出现页面不跳动问题
Sep 14 HTML / CSS
CSS3 Flex 弹性布局实例代码详解
Nov 01 HTML / CSS
CSS3 input框的实现代码类似Google登录的动画效果
Aug 04 HTML / CSS
HTML5 Canvas中使用用路径描画圆弧
Jan 01 HTML / CSS
浅谈html5之sse服务器发送事件EventSource介绍
Aug 28 HTML / CSS
HTML5添加禁止缩放功能
Nov 03 HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
Apr 29 HTML / CSS
three.js模拟实现太阳系行星体系功能
Sep 03 HTML / CSS
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
Aug 23 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实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
JavaScript 高效运行代码分析
2010/03/18 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
python进阶教程之循环对象
2014/08/30 Python
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
Random 在 Python 中的使用方法
2018/08/09 Python
详解Python做一个名片管理系统
2019/03/14 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
python实现梯度下降法
2020/03/24 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
初三物理教学反思
2014/01/21 职场文书
信息技术课后反思
2014/04/27 职场文书
幼儿园辞职书
2015/02/26 职场文书
专项资金申请报告
2015/05/15 职场文书
开网店计划分析
2019/07/30 职场文书