![HTML5实验室](https://wfqqreader-1252317822.image.myqcloud.com/cover/518/680518/b_680518.jpg)
上篇 实验
第1章 基础实验
实验1 奥运五环
简介
奥林匹克五环标志是由皮埃尔·德·顾拜旦先生于1913年构思设计的,是由《奥林匹克宪章》确定的,也被称为奥运五环标志,它是世界范围内最为人们广泛认知的奥林匹克运动会标志。它由5个奥林匹克环套接组成,有蓝、黄、黑、绿、红5种颜色。环从左到右互相套接,上面是蓝、黑、红环,下面是黄、绿环。整个造形为一个上方大底部小的规则梯形。五个不同颜色的圆环代表了参加现代奥林匹克运动会的五大洲——欧洲、亚洲、非洲、澳洲和美洲,如图1-1所示。
![](https://epubservercos.yuewen.com/E30E82/3590445604753101/epubprivate/OEBPS/Images/figure_0010_0001.jpg?sign=1739303953-ISb88dJx5NkebA24eDf0eRznW6S2Kmw3-0-12761d086e2f3f520bf09a7fd450dbfe)
图1-1 奥林匹克五环
如何在Canvas上绘制出一个一模一样的奥林匹克五环呢?首先从画圆开始。
画圆
在一切实验之前,要先理解Canvas中的坐标系统,假设一个宽是300高是150的Canvas标签,它内部的坐标变化如图1-2所示。
![](https://epubservercos.yuewen.com/E30E82/3590445604753101/epubprivate/OEBPS/Images/figure_0011_0001.jpg?sign=1739303953-BTsykWpZDFZibz92HjR5eFqzQCWawTob-0-8cbd77f35c28d85c7f88104d32a792ac)
图1-2 Canvas坐标
理解了坐标,开始画圆。CanvasRenderingContext2D对象提供了一组用来在画布上绘制的图形函数。使用CanvasRenderingContext2D.arc来绘制一个圆形。
语法:
arc(x, y, radius, startAngle, endAngle, counterclockwise)
利用该方法,直接在Canvas中画5个圆环。
<canvasid="myCanvas"width="400"height="200"style="border: 1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <scripttype="text/javascript"> var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.beginPath(); ctx.arc(70, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.beginPath(); ctx.arc(160, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.beginPath(); ctx.arc(250, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.beginPath(); ctx.arc(110, 110, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.beginPath(); ctx.arc(200, 110, 40, 0, Math.PI * 2, false); ctx.stroke(); </script>
效果如图1-3所示。
![](https://epubservercos.yuewen.com/E30E82/3590445604753101/epubprivate/OEBPS/Images/figure_0012_0001.jpg?sign=1739303953-aTt7pKXFY9t8VxgWymjhOxHHjIOg7CW0-0-3e299f424b1e4cbb3a1231a6554ddb52)
图1-3 简单的黑白五环
可以看到和标准的奥林匹克标志相比,圆环宽度不够,而且不是彩色的,所以要设置CanvasRenderingContext2D的属性来绘制更加逼真的圆环。
var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.lineWidth=5; ctx.strokeStyle="#163B62"; ctx.beginPath(); ctx.arc(70, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#000000"; ctx.beginPath(); ctx.arc(160, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#BF0628"; ctx.beginPath(); ctx.arc(250, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#EBC41F"; ctx.beginPath(); ctx.arc(110, 110, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#198E4A"; ctx.beginPath(); ctx.arc(200, 110, 40, 0, Math.PI * 2, false); ctx.stroke();
效果如图1-4所示。
![](https://epubservercos.yuewen.com/E30E82/3590445604753101/epubprivate/OEBPS/Images/figure_0013_0001.jpg?sign=1739303953-8Vy4qm1GlwBB1F9hHhJy8E2USx0CZK0u-0-8b948a44f4810d19fb07247dde995ec7)
图1-4不嵌套的彩色五环
现在基本上已经和奥林匹克标志差不多了。可是细心的读者会发现,后画的圆形会覆盖在先画的圆形上面,这样就失去了环环相扣的感觉,那么如何环环相扣呢?现在就要学习画弧。
画弧
可以通过画弧来重新覆盖应被覆盖的部分,以实现环环相扣的视觉效果。
在画弧之前,先回到CanvasRenderingContext2D的arc方法。
arc(x, y, radius, startAngle, endAngle, counterclockwise)
以上代码中各参数的意义如表1-1所示。
表1-1 各参数的意义
![](https://epubservercos.yuewen.com/E30E82/3590445604753101/epubprivate/OEBPS/Images/figure_0013_0002.jpg?sign=1739303953-f5s54APv7KlN0B6WAbaqGvlaVHY7x58G-0-45f192ae67c5b5485c00a2aa96f754a2)
如图1-5所示,更加形象化地表示了每个参数的意义。
![](https://epubservercos.yuewen.com/E30E82/3590445604753101/epubprivate/OEBPS/Images/figure_0013_0003.jpg?sign=1739303953-7TGcwgmJhfXmKRrB9zlwCffvEIQjiNwF-0-5b7619741e39b9ff1ee2275670f4a3ad)
图1-5 弧的各项参数
那么,需要怎样的一张图像盖在上面才能实现环环相扣的效果呢?如图1-6所示。
![](https://epubservercos.yuewen.com/E30E82/3590445604753101/epubprivate/OEBPS/Images/figure_0014_0001.jpg?sign=1739303953-IQr8nmofq6GG1CoDhttXTMvZtjazPTSI-0-504672b20767a93c180a3208af072e89)
图1-6画弧
通过下面的代码实现上面3段弧形:
ctx.strokeStyle="#163B62"; ctx.beginPath(); ctx.arc(70, 70, 40, Math.PI * 1.9, Math.PI * 2.1, false); ctx.stroke(); ctx.strokeStyle="#000000"; ctx.beginPath(); ctx.arc(160, 70, 40, Math.PI * 0.9, Math.PI * 2.1, false); ctx.stroke(); ctx.strokeStyle="#BF0628"; ctx.beginPath(); ctx.arc(250, 70, 40, Math.PI * 0.9, Math.PI * 1.1, false); ctx.stroke();
把上面画圆的代码和画弧的代码合起来,顺序是先画圆,后画弧,弧就会盖在圆的上面。完整的代码如下:
<canvasid="myCanvas"width="400"height="200"style="border: 1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <scripttype="text/javascript"> var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.lineWidth=5; \注:设置圆环的宽度\ ctx.strokeStyle="#163B62"; \注:设置圆环的颜色\ ctx.beginPath(); ctx.arc(70, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#000000"; ctx.beginPath(); ctx.arc(160, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#BF0628"; ctx.beginPath(); ctx.arc(250, 70, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#EBC41F"; ctx.beginPath(); ctx.arc(110, 110, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#198E4A"; ctx.beginPath(); ctx.arc(200, 110, 40, 0, Math.PI * 2, false); ctx.stroke(); ctx.strokeStyle="#163B62"; \注:从这里开始,下面是画弧\ ctx.beginPath(); ctx.arc(70, 70, 40, Math.PI * 1.9, Math.PI * 2.1, false); ctx.stroke(); ctx.strokeStyle="#000000"; ctx.beginPath(); ctx.arc(160, 70, 40, Math.PI * 0.9, Math.PI * 2.1, false); ctx.stroke(); ctx.strokeStyle="#BF0628"; ctx.beginPath(); ctx.arc(250, 70, 40, Math.PI * 0.9, Math.PI * 1.1, false); ctx.stroke(); </script>
运行效果如图1-7所示。
![](https://epubservercos.yuewen.com/E30E82/3590445604753101/epubprivate/OEBPS/Images/figure_0015_0001.jpg?sign=1739303953-JtN5xQJgHE5qf0P9LzUiNC891Oow5B91-0-89508c2832d462354b8af8158a81ba64)
图1-7 奥林匹克五环
就这样,实现了奥林匹克五环的环环相扣。其实CanvasRenderingContext2D不仅可以画空心圆,也可以画实心圆,下一个实验就会用到它相关的API。