html5 Canvas画图教程(5)—canvas里画曲线之arc方法


Posted in HTML / CSS onJanuary 09, 2013

在canvas画线条这篇文章中,我讲了画直线的方法,按理这篇画曲线的文章早该发了,但由于canvas画曲线比较特殊,我还没摸透,所以要一步步尝试。
canvas里画曲线的难点之一,就在于他连曲线的函数就有4个!分别是arc,arcTo,quadraticCurveTo,bezierCurveTo.我从最简单的arc方法讲起吧。
arc的作用是画一个正规的圆弧,可以是一个完整的圆,也可以是一个圆的某一段弧线。

arc的语法如下

复制代码
代码如下:

context.arc(x, y, radius, startAngle, endAngle, anticlockwise)

他的参数我解释一下,即
arc(圆心x,圆心y,半径,开始的角度,结束的角度,是否逆时针)
如果我们用arc画一个完整的圆,该怎么搞?大家注意到参数中有个开始角度与结束角度,如果我们开始角度是0,结束角度是360,不就是个正圆了?
正解!但要注意的是,这里的角度是用“弧度”来表示的(Flash也是如此),一个完整的圆即360度,就是2PI弧度。

所以我们这么写

复制代码
代码如下:

ctx.arc(400,400,20,0,Math.PI*2);
ctx.fill();
ctx.stroke();

和lineTo一样,arc也是画的路径,所以我们要在他后面调用填充或描边的方法才能显出图形(图中采用了红色的strokeStyle与半透明红色的fillStyle)。

html5 Canvas画图教程(5)—canvas里画曲线之arc方法


现在我们来画一个1/4圆,角度嘛,就是90度。前面说了,360度角即2PI弧度,那么一度角就是2PI/360=PI/180弧度,那么90度就是2PI/360*90=PI/2弧度(其他的角度请自行计算)。
复制代码
代码如下:

ctx.arc(400,400,20,0,Math.PI*2/4);

html5 Canvas画图教程(5)—canvas里画曲线之arc方法
 
由图我们可以确定arc的0度就是数学上常用的0度,但是角度默认是顺时针张开的,与数学模型相反(跟坐标有关,因为canvas坐标也与数学坐标相反)。
不过前面不是有个参数是确定是否逆时针吗?我们把他设为true如何?
复制代码
代码如下:

ctx.arc(400,400,20,0,Math.PI*2/4,true);

html5 Canvas画图教程(5)—canvas里画曲线之arc方法
 
你会看到,角度变成了逆时针展开,导致弧线变成了360-90=270度。
但是!大家要注意一点,就是起点与终点的计算方式,始终是以0度为起点,并顺时针延伸的,不存在顺反的说法。顺反时针只是弧线的绘制方向。
这样不仅仅可以防止顺来逆去的容易混淆,而且更方便计算。
不过,灵活的使用逆时针,有时候很有用。
上面的例子,我们的起点角度都是0,现在我们试试其他的起点角度吧,比如90度。
复制代码
代码如下:

ctx.arc(400,400,20,Math.PI*2/4,Math.PI*2+Math.PI);

如果我们起点是90度而终点也是90度,那结果就是什么都不得画,所以我把终点角度改成了180度,最后得到下图的图形。

html5 Canvas画图教程(5)—canvas里画曲线之arc方法

问题:如果我们从非0度起点来画一个完整的圆,行不行?当然也可以,只要你把弧线的终点设置为360度+起点角度,如:
复制代码
代码如下:

ctx.arc(400,400,20,Math.PI*2/4,Math.PI*2+Math.PI*2/4); //起点90度,终点360+90度

不过这种做法纯属没事找事,正常人是不会用的。
总结:Canvas的arc方法是画正圆弧线的办法,也只能画正弧线,没法画其他奇怪的弧线,比如S形——虽然我最喜欢S形了。
HTML / CSS 相关文章推荐
css3 中实现炫酷的loading效果
Apr 26 HTML / CSS
css3发光搜索表单分享
Apr 11 HTML / CSS
实例讲解使用CSS实现多边框和透明边框的方法
Sep 08 HTML / CSS
谈谈对css属性box-sizing的了解
Jan 04 HTML / CSS
HTML5拖放功能_动力节点Java学院整理
Jul 13 HTML / CSS
基于Html5实现的react拖拽排序组件示例
Aug 13 HTML / CSS
Javascript 高级手势使用介绍
Apr 21 HTML / CSS
HTML5为输入框添加语音输入功能的实现方法
Feb 06 HTML / CSS
HTML5拖放API实现拖放排序的实例代码
May 11 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
Jul 22 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
Nov 04 HTML / CSS
HTML5 图片悬停放大的实现代码示例
Dec 04 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
使用html5+css3来实现slider切换效果告别javascript+css
Jan 08 #HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
Jan 07 #HTML / CSS
html5 canvas-2.用canvas制作一个猜字母的小游戏
Jan 07 #HTML / CSS
You might like
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
php遍历目录方法小结
2015/03/10 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
JS实现星星海特效
2019/12/24 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
Python中方法链的使用方法
2016/02/23 Python
Python反射的用法实例分析
2018/02/11 Python
浅谈Python中的私有变量
2018/02/28 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
教师业务培训方案
2014/05/01 职场文书
消防工作实施方案
2014/06/09 职场文书
团日活动总结怎么写
2014/06/25 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
房产公证书样本
2015/01/23 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL