html5 Canvas画图教程(9)—canvas中画出矩形和圆形


Posted in HTML / CSS onJanuary 09, 2013

本文讲一下在canvas中画出矩形和圆形的办法,他们属于基础图形。当然,基础图形本来不止他们,但在canvas中,只有画矩形与圆形不需要用其他方法模拟。

canvas画矩形
1,fillRect与strokeRect
fillRect可以直接填充出一个矩形,填充样式是你当前设置的样式;同理strokeRect就是直接描边一个矩形
他们的参数是一致的,依次是(起点x坐标,起点y,矩形的宽,矩形的高)。这里的起点,注意,是指矩形的左上角那个点。
我们通常用他们来做简单的事,他们也只能做简单的事。为什么?因为他们画的图形没有“路径”的说法,直接就出来了。
比如你先用fillRect填充了一个矩形,然后你想把这个矩形描边,如果你使用stroke(),则不会有效果,因为此时虽然有个矩形,但并不存在路径。
如果你迫切的想把这个矩形描边,你可以在同样的位置使用strokeRect()来描边一个矩形——但他们其实是独立的,只是位置重叠罢了。

复制代码
代码如下:

ctx.fillRect(200,100,50,40);
ctx.strokeRect(200,100,50,40);

如果我们想要一个又有填充又有描边的矩形,那同时使用fillRect和strokeRect无疑显得很累赘。所以这种情况我们通常使用以下方法。

2,rect
rect的参数与fillRect和strokeRect毫无差别,不同的是他画出的只是路径,至于描边或是填充要你后续自己完成。

复制代码
代码如下:

ctx.rect(300,100,50,40);
ctx.stroke()
ctx.fill();

这样做有什么好处呢?前面的文章我提到过,填充或描边会消耗大量资源,所以我们经常(比如循环)需要一次性绘制几百条路径,再来描边或填充。此时使用rect画路径,最后再填充,就避免了fillRect和strokeRec每次都要填充或描边的问题。

3,lineTo
当然你也可以像我的画线条的教程那样,用4个lineTo来画出一个矩形。但这毫无必要,具体可查看那篇文章。

Canvas画圆形
苍天无眼,其实canvas并没有一个真正的可以直接画出圆形的函数,他画的其实是一个360度的圆弧,看起来就是个圆形了。
canvas画圆弧的函数我们前面讲过了,即arc.我们用他来画一个圆形:

复制代码
代码如下:

ctx.arc(300+25,100+20,20,0,Math.PI*2);
ctx.stroke()
ctx.fill();

这个arc和rect一样,画出的也是路径,填充或描边需要后续完成。
但要注意的是,圆形的位置判断和矩形是不一样的。我们以矩形的左上角为起点确定他的位置,但圆形的位置我们通常用圆心来确定。
如果你想画一组水平和垂直都居中的矩形与圆形,那你可要记得不要把矩形的起点当成了画圆形的起点——圆形的起点可是圆心哈!
html5 Canvas画图教程(9)—canvas中画出矩形和圆形 
算了,我还是给你一个现在的公式吧,对齐的圆与矩形,圆心的坐标=矩形的坐标+矩形的一半宽高。
也就是圆心x=矩形x+矩形宽/2,圆形y=矩形y+矩形高/2。这样他们就是绝对对齐了的。
虽然arc没有直接画圆的方法那么好用——我设想的直接画圆的方法只需要3个参数,即圆心坐标即半径——但arc不止可以画圆,还可以画半圆什么的,所以功能更强大,用着也将就了。
既然有圆,那么就应该有椭圆,但canvas中连一个正规的画圆的函数都没有,更别提椭圆了。所以画椭圆必须用其他方法模拟,这个比较复杂,我留到后面讲吧。
HTML / CSS 相关文章推荐
CSS3解决移动页面上点击链接触发色块的问题
Jun 03 HTML / CSS
CSS3 伪类选择器 nth-child()说明
Jul 10 HTML / CSS
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
Jun 11 HTML / CSS
CSS3打造磨砂玻璃背景效果
Sep 28 HTML / CSS
css3 实现圆形旋转倒计时
Feb 24 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
May 28 HTML / CSS
html5 offlline 缓存使用示例
Jun 24 HTML / CSS
Html5插件教程之添加浏览器放大镜效果的商品橱窗
Jan 07 HTML / CSS
推荐10个HTML5响应式框架
Feb 25 HTML / CSS
谈一谈HTML5本地存储技术
Mar 02 HTML / CSS
HTML5拖放API实现拖放排序的实例代码
May 11 HTML / CSS
z-index不起作用
Mar 31 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
Jan 09 #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
You might like
PHP伪静态页面函数附使用方法
2008/06/20 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
在Django框架中运行Python应用全攻略
2015/07/17 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
python使用knn实现特征向量分类
2018/12/26 Python
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
大学自主招生自荐信范文
2014/02/26 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
Python语言中的数据类型-序列
2022/02/24 Python