今天查了一下beginPath()和closePath()关于区域的划分问题,发现到一篇解释得很明白的文章,我就直接转载到这里了。

原文请看:canvas的beginPath和closePath分析总结,包括多段弧的情况,作者是:妙音天女

先看两个例子

> 例1:

  1. <canvas id="myCanvas" width="300" height="300" style="border:1px solid #000000;">
  2. 您的浏览器不支持 HTML5 canvas 标签。
  3. </canvas>
  4. <script>
  5. var ctx = document.getElementById("myCanvas").getContext('2d');
  6. ctx.beginPath();
  7. ctx.moveTo(100.5,20.5);
  8. ctx.lineTo(200.5,20.5);
  9. ctx.strokeStyle = 'black';//默认strokeStyle='black', lineWidth=1, 此处可省略
  10. ctx.stroke();
  11. ctx.beginPath();
  12. ctx.moveTo(100.5,40.5);
  13. ctx.lineTo(200.5,40.5)
  14. ctx.strokeStyle = 'red';
  15. ctx.stroke();
  16. </script>

结果:

> 例2:去掉第2个beginPath()

  1. <canvas id="myCanvas" width="300" height="300" style="border:1px solid #000000;">
  2. 您的浏览器不支持 HTML5 canvas 标签。
  3. </canvas>
  4. <script>
  5. var ctx = document.getElementById("myCanvas").getContext('2d');
  6. ctx.beginPath();
  7. ctx.moveTo(100.5,20.5);//①
  8. ctx.lineTo(200.5,20.5);//②
  9. ctx.strokeStyle = 'black';//默认strokeStyle='black', lineWidth=1, 此处可省略
  10. ctx.stroke();
  11. ctx.moveTo(100.5,40.5);//③
  12. ctx.lineTo(200.5,40.5)//④
  13. ctx.strokeStyle = 'red';
  14. ctx.stroke();
  15. </script>

结果:

> beginPath

  • canvas中的绘制方法(如stroke, fill),都会以“上一次beginPath”之后的所有路径为基础进行绘制。比如例2中stroke了两次,都是以第一次beginPath后的所有路径为基础画的。

    • 第一次stroke:画①②,黑色
    • 第二次stroke:画①②③④,红色(其中①②红色覆盖之前的黑色)
  • 不管你用moveTo把画笔移动到哪里,只要不beginPath,那你一直都是在画一条路径(注:此处『一条路径』并非指连在一起)
    • fillRect与strokeRect这种直接画出独立区域的函数,也不会打断当前的path.

> beginPath

  • closePath的意思不是结束路径,而是关闭路径,它会试图从当前路径的终点连一条路径到起点,让整个路径闭合起来。但是,这并不意味着它之后的路径就是新路径了
  • 与beginPath几乎没有关系:不要企图通过闭合现有路径来开始一条新路径,而开始一条新路径,以前的路径也不会闭合。

对于绘制多段弧,看下面几个例子:

> 例3:

  1. var context = document.getElementById("myCanvas").getContext('2d');
  2. context.strokeStyle="#005588";
  3. for (var i = 0; i < 10; i ++){
  4. context.beginPath();
  5. context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10);
  6. context.closePath();
  7. context.stroke();
  8. }

结果:

> 例4:在例3的基础上只去掉closePath()

  1. var context = document.getElementById("myCanvas").getContext('2d');
  2. context.strokeStyle="#005588";
  3. for (var i = 0; i < 10; i ++){
  4. context.beginPath();
  5. context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10);
  6. //context.closePath();
  7. context.stroke();
  8. }

结果:

> 例5:在例3的基础上去掉beginPath()和closePath()

  1. var context = document.getElementById("myCanvas").getContext('2d');
  2. context.strokeStyle="#005588";
  3. for (var i = 0; i < 10; i ++){
  4. //context.beginPath();
  5. context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10);
  6. //context.closePath();
  7. context.stroke();
  8. }

结果:

可见,在这种情况下,每个弧画完都会连到下一个弧的起点

> 例6:在例3的基础上只去掉beginPath()

  1. var context = document.getElementById("myCanvas").getContext('2d');
  2. context.strokeStyle="#005588";
  3. for (var i = 0; i < 10; i ++){
  4. //context.beginPath();
  5. context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10);
  6. context.closePath();
  7. context.stroke();
  8. }

结果:

这样看不太清晰,我们将i < 10改为i < 3,只显示前三个:

可见,在这种情况下,每个弧画完都会先回到第一个弧的起点,然后再连到下一个弧的起点

> 例7:在例3的基础上将stroke()改为fill()

  1. var context = document.getElementById("myCanvas").getContext('2d');
  2. context.fillStyle="#005588";
  3. for (var i = 0; i < 10; i ++){
  4. context.beginPath();
  5. context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10);
  6. //context.closePath();
  7. context.fill();
  8. }

结果:

> 例8:在例7的基础上去掉closePath()

  1. var context = document.getElementById("myCanvas").getContext('2d');
  2. context.fillStyle="#005588";
  3. for (var i = 0; i < 10; i ++){
  4. context.beginPath();
  5. context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10);
  6. context.closePath();
  7. context.fill();
  8. }

结果:

> 比较例7和例8可知:

无论是否closePath(),结果都一样。

因为closePath()对于fill()是没有用的:无论是否closePath(),调用fill()时,canvas会自动把没有封闭的路径首尾相连,之后进行填充。

关于beginPath()和closePath()的关系>>canvas的beginPath和closePath分析总结,包括多段弧的情况的更多相关文章

  1. canvas的beginPath和closePath分析总结,包括多段弧的情况

    参考博文: Html5 canvas画图教程17:论beginPath的重要性 先看两个例子 例1: <canvas id="myCanvas" width="30 ...

  2. HTML5 CANVAS画图 beginPath和closePath

    beginPath这个canvas函数我很早就讲过了,他的作用很简单,就是开始一段新路径,我们先来看下面的一小段代码: var ctx = document.getElementById('cvs') ...

  3. canvas的beginPath和closePath

    https://www.cnblogs.com/xuehaoyue/p/6549682.html https://segmentfault.com/a/1190000010330319 https:/ ...

  4. 基于canvas的陈列订货的分析

    订货会软件中又新增了进行陈列订货,即一杆衣服订的显示出来,没订的不显示出来 主要遇到的问题是如何呈现,原先老是想着定位,left,top但是花出来的图容易出现原先的数据填写错误导致后期的图片的呈现出现 ...

  5. UI基础:UI中类的继承关系图,最基本的视图分析

    首先,UI中常用的UIwindow.UILabel.UIButton.UITextField属于UIView的子类.UITextField和UILabel和UIwindow自身没有初始化方法,需要使用 ...

  6. AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。

    开篇三问 AJAX请求真的不安全么? AJAX请求哪里不安全? 怎么样让AJAX请求更安全? 前言 本文包含的内容较多,包括AJAX,CORS,XSS,CSRF等内容,要完整的看完并理解需要付出一定的 ...

  7. 在矩池云使用Disco Diffusion生成AI艺术图

    在 Disco Diffusion 官方说明的第一段,其对自身是这样定义: AI Image generating technique called CLIP-Guided Diffusion.DD ...

  8. 基于canvas实现物理运动效果与动画效果(一)

    一.为什么要写这篇文章 某年某月某时某种原因,我在慕课网上看到了一个大神实现了关于小球的抛物线运动的代码,心中很是欣喜,故而写这篇文章来向这位大神致敬,同时也为了弥补自己在运动效果和动画效果制作方面的 ...

  9. html5 canvas时钟

    基础知识点:                canvas标签只是图形容器,您必须使用脚本来绘制图形. getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性.——获取上 ...

随机推荐

  1. [BZOJ 1056][HAOI2008]排名系统

    传送门 \(\color{green}{solution}\) \(fhq \_treap\)模板题. 对于 \(+\) 操作,如果当前人不存在,那么直接加入;如果存在,那么先将他删除,再加入.复杂度 ...

  2. [LibreOJ #2341]【WC2018】即时战略【交互】【LCT】

    Description 有一棵n个点的结构未知的树,初始时只有1号点是已被访问的. 你可以调用交互库的询问函数explore(x,y),其中x是已访问的点,y是任意点. 它会返回x向y方向走第一步的点 ...

  3. Android开发不可或缺的十大网站及工具

    1. Google 做开发前完全是小白,真心不知道有Google这东西,只晓得百度,遇到问题直接百度,不是黑百度,百度在娱乐八卦方面确实靠谱,但是技术方面查出来的东西基本千篇一律,有些答案甚至还会起到 ...

  4. (转)Mysql数据库之Binlog日志使用总结

    使用mysqlbinlog提取二进制日志 原文:http://blog.csdn.net/leshami/article/details/41962243 MySQL binlog日志记录了MySQL ...

  5. 【Maven学习】maven-assembly-plugin的使用

    转自http://liugang594.iteye.com/blog/2093607 maven-assembly-plugin使用描述(拷自 maven-assembly-plugin 主页) Th ...

  6. eclips中maven解决jsp报错的问题

    加入如下的pom依赖: <!-- 解决jsp报错的依赖包第一个 --> <dependency> <groupId>javax.servlet</groupI ...

  7. ECharts概念学习系列之ECharts是什么?

    不多说,直接上干货! http://echarts.baidu.com/index.html http://echarts.baidu.com/echarts2/index.html 开源的EChar ...

  8. DOS命令行操作MySQL数据库中文乱码问题解决

    我们在 dos 命令行操作中文时,会报错 ’); ERROR (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 原因:因为 ...

  9. 关于docker的理解随记

    1.容器其实不是什么新技术,说白了就是namespace对资源进行隔离,再加UFS实现分层镜像,以及cgroup实现资源限制.这些技术,都是linux中已有的技术,而且有些技术很早之前就有了. 2.上 ...

  10. Maven报错:maven-archetype-webapp:RELEASE from any of the configured repositories

    今天学习maven,在控制台下新建maven项目没有问题,但是在STS(eclipse)下创建maven项目老是报错,郁闷死了: ----------------------------------- ...