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实现平移动画效果示例代码
Oct 12 HTML / CSS
CSS3实现全景图特效示例代码
Mar 26 HTML / CSS
css3实现可拖动的魔方3d效果
May 07 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
Jul 19 HTML / CSS
HTML5边玩边学(2)基础绘图实现方法
Sep 21 HTML / CSS
免费获得微软MCSD证书赶快行动吧!
Nov 13 HTML / CSS
html5使用canvas绘制文字特效
Dec 15 HTML / CSS
HTML5 Canvas绘制圆点虚线实例
Jan 01 HTML / CSS
针对HTML5的Web Worker使用攻略
Jul 12 HTML / CSS
用HTML5的canvas实现一个炫酷时钟效果
May 20 HTML / CSS
canvas裁剪clip()函数的具体使用
Mar 01 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
Jul 10 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
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php生成curl命令行的方法
2015/12/14 PHP
PHP微信支付实例解析
2016/07/22 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
vue实现验证用户名是否可用
2021/01/20 Vue.js
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
浅谈python之新式类
2018/08/12 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
法律专业学生的自我评价
2014/02/07 职场文书
自主招生推荐信范文
2014/05/10 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
街道务虚会发言材料
2014/10/20 职场文书
财务工作失职检讨书
2014/11/21 职场文书
青春雷锋观后感
2015/06/10 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python