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实现input输入框颜色渐变发光效果代码
Apr 02 HTML / CSS
canvas三角函数模拟水波效果的示例代码
Jul 03 HTML / CSS
HTML5 CSS3新的WEB标准和浏览器支持
Jul 16 HTML / CSS
html标签之Object和EMBED标签详解
Jul 04 HTML / CSS
HTML5手机端弹出遮罩菜单特效代码
Jan 27 HTML / CSS
HTML5 LocalStorage 本地存储刷新值还在
Mar 10 HTML / CSS
Html5自定义字体解决方法
Oct 09 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
May 26 HTML / CSS
详解HTML5布局和HTML5标签
Oct 26 HTML / CSS
基于HTML十秒做出淘宝页面
Oct 24 HTML / CSS
浅谈css实现背景颜色半透明的两种方法
Dec 06 HTML / CSS
HTML CSS 一个标签实现带动画的抖音LOGO
Apr 26 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
在JavaScript中调用php程序
2009/03/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
什么是JavaScript
2009/08/13 Javascript
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
python中while循环语句用法简单实例
2015/05/07 Python
python操作redis的方法
2015/07/07 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
草莓网英国官网:Strawberrynet UK
2017/02/12 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
跟单文员的岗位职责
2013/11/14 职场文书
满月酒答谢词
2014/01/14 职场文书
高校十八大报告感想
2014/01/27 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫