上篇 实验
第1章 基础实验
实验1 奥运五环
简介
奥林匹克五环标志是由皮埃尔·德·顾拜旦先生于1913年构思设计的,是由《奥林匹克宪章》确定的,也被称为奥运五环标志,它是世界范围内最为人们广泛认知的奥林匹克运动会标志。它由5个奥林匹克环套接组成,有蓝、黄、黑、绿、红5种颜色。环从左到右互相套接,上面是蓝、黑、红环,下面是黄、绿环。整个造形为一个上方大底部小的规则梯形。五个不同颜色的圆环代表了参加现代奥林匹克运动会的五大洲——欧洲、亚洲、非洲、澳洲和美洲,如图1-1所示。
图1-1 奥林匹克五环
如何在Canvas上绘制出一个一模一样的奥林匹克五环呢?首先从画圆开始。
画圆
在一切实验之前,要先理解Canvas中的坐标系统,假设一个宽是300高是150的Canvas标签,它内部的坐标变化如图1-2所示。
图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所示。
图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所示。
图1-4不嵌套的彩色五环
现在基本上已经和奥林匹克标志差不多了。可是细心的读者会发现,后画的圆形会覆盖在先画的圆形上面,这样就失去了环环相扣的感觉,那么如何环环相扣呢?现在就要学习画弧。
画弧
可以通过画弧来重新覆盖应被覆盖的部分,以实现环环相扣的视觉效果。
在画弧之前,先回到CanvasRenderingContext2D的arc方法。
arc(x, y, radius, startAngle, endAngle, counterclockwise)
以上代码中各参数的意义如表1-1所示。
表1-1 各参数的意义
如图1-5所示,更加形象化地表示了每个参数的意义。
图1-5 弧的各项参数
那么,需要怎样的一张图像盖在上面才能实现环环相扣的效果呢?如图1-6所示。
图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所示。
图1-7 奥林匹克五环
就这样,实现了奥林匹克五环的环环相扣。其实CanvasRenderingContext2D不仅可以画空心圆,也可以画实心圆,下一个实验就会用到它相关的API。