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 3D位移translate效果实例介绍
May 03 HTML / CSS
css3 border旋转时的动画应用
Jan 22 HTML / CSS
利用css3画个同心圆示例代码
Jul 03 HTML / CSS
2分钟教你实现环形/扇形菜单(基础版)
Jan 15 HTML / CSS
HTML5 device access 设备访问详解
May 24 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
Nov 18 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
May 08 HTML / CSS
html5各种页面切换效果和模态对话框用法总结
Dec 15 HTML / CSS
解析HTML5中的新功能本地存储localStorage
Mar 01 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
Mar 25 HTML / CSS
用html5的canvas和JavaScript创建一个绘图程序的简单实例
Jul 06 HTML / CSS
canvas线条的属性详解
Mar 27 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
一个简单的PHP&MYSQL留言板源码
2020/07/19 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
php生成mysql的数据字典
2016/07/07 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
python读写ini文件示例(python读写文件)
2014/03/25 Python
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
公务员个人自我评价分享
2013/11/06 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
大国崛起观后感
2015/06/02 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android