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和布局经验与要点
Apr 09 HTML / CSS
css 元素选择器的简单实例
May 23 HTML / CSS
CSS3实现可爱的小黄人动画
Jul 11 HTML / CSS
css3实现3D文本悬停改变效果的示例代码
Jan 16 HTML / CSS
HTML5新增加标签和功能概述
Sep 05 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
Oct 16 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
Jul 04 HTML / CSS
HTML5实现直播间评论滚动效果的代码
May 27 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
Aug 17 HTML / CSS
HTML中的表单Form实现居中效果
May 25 HTML / CSS
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
Jan 18 HTML / CSS
HTML5基础学习之文本标签控制
Mar 25 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
微信支付开发维权通知实例
2016/07/12 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
VUE重点问题总结
2018/03/19 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
在Python中关于中文编码问题的处理建议
2015/04/08 Python
Python数据结构之翻转链表
2017/02/25 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
化工机械应届生求职信
2013/11/04 职场文书
社区消防工作实施方案
2014/03/21 职场文书
女生节标语
2014/06/26 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
辞职信如何写
2015/02/27 职场文书
英文产品推荐信
2015/03/27 职场文书
在校生证明
2015/06/17 职场文书
七年级语文教学反思
2016/03/03 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL