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使用技巧5个
Apr 02 HTML / CSS
利用CSS3的transform做的动态时钟效果
Sep 21 HTML / CSS
CSS书写规范、顺序和命名规则
Mar 06 HTML / CSS
css3的过滤效果简单实例
Aug 03 HTML / CSS
html5中 media(播放器)的api使用指南
Dec 26 HTML / CSS
HTML5+CSS3实现机器猫
Oct 17 HTML / CSS
HTML5响应式(自适应)网页设计的实现
Nov 17 HTML / CSS
浅谈关于html5中图片抛物线运动的一些心得
Jan 09 HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
Jan 18 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
Nov 26 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
Oct 28 HTML / CSS
CSS实现单选折叠菜单功能
Nov 01 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
BBS(php & mysql)完整版(五)
2006/10/09 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
关于RxJS Subject的学习笔记
2018/12/05 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
Django 外键的使用方法详解
2019/07/19 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
大学生秋游活动方案
2014/02/17 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
2015年营业员工作总结
2015/04/23 职场文书
环保证明
2015/06/23 职场文书
Python函数中的不定长参数相关知识总结
2021/06/24 Python
Docker官方工具docker-registry案例演示
2022/04/13 Servers
MySQL的存储过程和相关函数
2022/04/26 MySQL