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制作的简洁蓝白风格的登录模板(非IE效果更好)
Aug 11 HTML / CSS
css3弹性盒模型(Flexbox)详细介绍
Oct 08 HTML / CSS
详解CSS3中使用gradient实现渐变效果的方法
Aug 18 HTML / CSS
css3实现蒙版弹幕功能
Jun 18 HTML / CSS
CSS3实现网站商品展示效果图
Jan 18 HTML / CSS
使用HTML5的File实现base64和图片的互转
Aug 01 HTML / CSS
html5画布旋转效果示例
Jan 27 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
Apr 10 HTML / CSS
html5 Canvas实现图片旋转的示例
Jan 15 HTML / CSS
关于iframe跨域使用postMessage的实现
Oct 29 HTML / CSS
HTML5 实现图片上传预处理功能
Feb 06 HTML / CSS
HTML 里 img 元素的 src 和 srcset 属性的区别详解
May 21 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
长波有什么东西
2021/03/01 无线电
PHP进程同步代码实例
2015/02/12 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
JavaScript 注册事件代码
2011/01/27 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
python连接sql server乱码的解决方法
2013/01/28 Python
Python实现完整的事务操作示例
2017/06/20 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
使用pip发布Python程序的方法步骤
2018/10/11 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
学python爬虫能做什么
2020/07/29 Python
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
会计专业毕业生求职信分享
2014/01/03 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
行政求职信
2014/07/04 职场文书
司法局2014法制宣传日活动总结
2014/11/01 职场文书
死亡赔偿协议书
2015/01/28 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript