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教程(1):什么是CSS3
Apr 02 HTML / CSS
css3中less实现文字长阴影(long shadow)
Apr 24 HTML / CSS
Canvas 文字碰撞检测并抽稀的方法
May 27 HTML / CSS
socket.io 和canvas 实现的共享画板功能
May 22 HTML / CSS
关于 HTML5 的七个传说小结
Apr 12 HTML / CSS
HTML5中的拖放实现详解
Aug 23 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
Apr 27 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
Aug 19 HTML / CSS
HTML速写之Emmet语法规则的实现
Apr 07 HTML / CSS
html中显示特殊符号(附带特殊字符对应表)
Jun 21 HTML / CSS
CSS实现五种常用的2D转换
Dec 06 HTML / CSS
HTML5之高度塌陷问题的解决
Jun 01 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
smarty内置函数capture用法分析
2015/01/22 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
php简单截取字符串代码示例
2016/10/19 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
Python中的进程分支fork和exec详解
2015/04/11 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
python计算二维矩形IOU实例
2020/01/18 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
如何写一个自定义标签
2012/12/28 面试题
团日活动总结报告
2014/06/25 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
2016春节慰问信范文
2015/03/25 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
修改并编译golang源码的操作步骤
2021/07/25 Golang
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python