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背景图片的背景裁切、背景透明度、背景变换等效果运用
Dec 24 HTML / CSS
CSS3 制作绽放的莲花采用效果叠加实现
Jan 31 HTML / CSS
CSS3的column-fill属性对齐列内容高度的用法详解
Jul 01 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
Dec 13 HTML / CSS
Javascript 高级手势使用介绍
Apr 21 HTML / CSS
Canvas多边形绘制的实现方法
Aug 05 HTML / CSS
canvas绘制树形结构可视图形的实现
Apr 03 HTML / CSS
css animation配合SVG制作能量流动效果
Mar 24 HTML / CSS
css3 选择器
May 11 HTML / CSS
如何解决flex文本溢出问题小结
Jul 15 HTML / CSS
css让页脚保持在底部位置的四种方案
Jul 23 HTML / CSS
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
May 07 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
咖啡与水的关系
2021/03/03 冲泡冲煮
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
Python实现的北京积分落户数据分析示例
2020/03/27 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
浅析python函数式编程
2020/09/26 Python
HEMA法国:荷兰原创设计
2019/02/21 全球购物
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
幼儿园评语大全
2014/04/17 职场文书
留学生求职信
2014/06/03 职场文书
好听的队名和口号
2014/06/09 职场文书
假释思想汇报范文
2014/10/11 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript