JavaScript图形实例:正多边形
<p> 圆心位于坐标原点,半径为R的圆的参数方程为</p><p> X=R*COS(θ)</p>
<p> Y=R*SIN(θ)</p>
<p> 在圆上取N个等分点,将这N个点首尾连接N条边,可以得到一个正N边形。</p>
<h3>1.正多边形阵列</h3>
<p> 构造一个8行8列的正N(N为3~10)边形阵列。编写如下的HTML代码。</p>
<p style="margin-left: 30px"><!DOCTYPE html></p>
<p style="margin-left: 30px"><head></p>
<p style="margin-left: 30px"><title>正多边形阵列</title></p>
<p style="margin-left: 30px"><script type="text/javascript"></p>
<p style="margin-left: 30px"> function draw(id)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px"> if (canvas==null)</p>
<p style="margin-left: 30px"> return false;</p>
<p style="margin-left: 30px"> var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px"> context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px"> context.fillRect(0,0,400,400);</p>
<p style="margin-left: 30px"> context.fillStyle="yellow";</p>
<p style="margin-left: 30px"> context.strokeStyle="red";</p>
<p style="margin-left: 30px"> context.lineWidth=1;</p>
<p style="margin-left: 30px"> context.beginPath();</p>
<p style="margin-left: 30px"> for (px=30;px<390;px+=45)</p>
<p style="margin-left: 30px"> for (py=30;py<390;py+=45)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> n=((px-30)/45+(py-30)/45)%8+3;</p>
<p style="margin-left: 30px"> for (i=0;i<=n;i++)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> x1=20*Math.cos(i*Math.PI*2/n);</p>
<p style="margin-left: 30px"> y1=20*Math.sin(i*Math.PI*2/n);</p>
<p style="margin-left: 30px"> x=px+x1;</p>
<p style="margin-left: 30px"> y=py+y1;</p>
<p style="margin-left: 30px"> if (i==0)</p>
<p style="margin-left: 30px"> context.moveTo(x,y);</p>
<p style="margin-left: 30px"> else</p>
<p style="margin-left: 30px"> context.lineTo(x,y);</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"> context.closePath();</p>
<p style="margin-left: 30px"> context.stroke();</p>
<p style="margin-left: 30px"> context.fill();</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"></script></p>
<p style="margin-left: 30px"></head></p>
<p style="margin-left: 30px"><body onload="draw('myCanvas');"></p>
<p style="margin-left: 30px"><canvas id="myCanvas" width="400" height="400">您的浏览器不支持canvas!</p>
<p style="margin-left: 30px"></canvas></p>
<p style="margin-left: 30px"></body></p>
<p style="margin-left: 30px"></html></p>
<p> 将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出正3~10边形阵列,如图1所示。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191223203352382-424476450.png"> </p>
<p align="center">图1 正3~10边形阵列</p>
<h3>2.边长相等的正多边形</h3>
<p> 图1中的正N边形通过在圆周上取N等分点得到的,它们的外接圆的半径均相等,但各自的边长并不相等。若要绘制出边长相等的正N边形,可以编写如下的HTML文件。</p>
<p style="margin-left: 30px"><!DOCTYPE html></p>
<p style="margin-left: 30px"><head></p>
<p style="margin-left: 30px"><title>边长相等的正多边形</title></p>
<p style="margin-left: 30px"><script type="text/javascript"></p>
<p style="margin-left: 30px"> function draw(id)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px"> if (canvas==null)</p>
<p style="margin-left: 30px"> return false;</p>
<p style="margin-left: 30px"> var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px"> context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px"> context.fillRect(0,0,400,300);</p>
<p style="margin-left: 30px"> context.strokeStyle="blue";</p>
<p style="margin-left: 30px"> context.lineWidth=2;</p>
<p style="margin-left: 30px"> var x0=150;</p>
<p style="margin-left: 30px"> var y0=30;</p>
<p style="margin-left: 30px"> context.beginPath();</p>
<p style="margin-left: 30px"> for (n=3;n<=10;n++)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> dig=6.28318/n;</p>
<p style="margin-left: 30px"> context.moveTo(x0,y0);</p>
<p style="margin-left: 30px"> x=x0;</p>
<p style="margin-left: 30px"> y=y0;</p>
<p style="margin-left: 30px"> for(i=0;i<n;i++)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> x=x+80*Math.cos(i*dig);</p>
<p style="margin-left: 30px"> y=y+80*Math.sin(i*dig);</p>
<p style="margin-left: 30px"> context.lineTo(x,y);</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"> context.lineTo(x0,y0);</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"> context.stroke();</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"></script></p>
<p style="margin-left: 30px"></head></p>
<p style="margin-left: 30px"><body onload="draw('myCanvas');"></p>
<p style="margin-left: 30px"><canvas id="myCanvas" width="400" height="300">您的浏览器不支持canvas!</p>
<p style="margin-left: 30px"></canvas></p>
<p style="margin-left: 30px"></body></p>
<p style="margin-left: 30px"></html></p>
<p> 将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出边长相等的正多边形(从正三角形到正十边形),如图2所示。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191223203432648-1954329327.png"> </p>
<p align="center">图2 边长相等的正多边形</p>
<h3>3.漂亮的圆盘</h3>
<p> 在圆周上取N等分点,将这N个等分点两两用线段相连,共连N*(N-1)/2条边,可以绘制出圆盘图案。编写的HTML代码如下。</p>
<p style="margin-left: 30px"><!DOCTYPE html></p>
<p style="margin-left: 30px"><head></p>
<p style="margin-left: 30px"><title>圆盘图案</title></p>
<p style="margin-left: 30px"><script type="text/javascript"></p>
<p style="margin-left: 30px"> function draw(id)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px"> if (canvas==null)</p>
<p style="margin-left: 30px"> return false;</p>
<p style="margin-left: 30px"> var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px"> context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px"> context.fillRect(0,0,400,400);</p>
<p style="margin-left: 30px"> context.strokeStyle="red";</p>
<p style="margin-left: 30px"> context.lineWidth=1;</p>
<p style="margin-left: 30px"> var x=new Array(25);</p>
<p style="margin-left: 30px"> var y=new Array(25);</p>
<p style="margin-left: 30px"> var r = 180;</p>
<p style="margin-left: 30px"> var n=25;</p>
<p style="margin-left: 30px"> for (i = 0; i <n; i++)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> x = r * Math.cos(2 *Math.PI * i/n) + 200; </p>
<p style="margin-left: 30px"> y = r * Math.sin(2 *Math.PI * i/n) + 200; </p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"> context.beginPath();</p>
<p style="margin-left: 30px"> for (i = 0; i <n-1; i++)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> for (j = i + 1; j <n ; j++)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> context.moveTo(x,y);</p>
<p style="margin-left: 30px"> context.lineTo(x,y);</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"> context.closePath();</p>
<p style="margin-left: 30px"> context.stroke();</p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"></script></p>
<p style="margin-left: 30px"></head></p>
<p style="margin-left: 30px"><body onload="draw('myCanvas');"></p>
<p style="margin-left: 30px"><canvas id="myCanvas" width="400" height="400">您的浏览器不支持canvas!</p>
<p style="margin-left: 30px"></canvas></p>
<p style="margin-left: 30px"></body></p>
<p style="margin-left: 30px"></html></p>
<p> 在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出漂亮的圆盘图案,如图3所示。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191223203509118-1051828449.png"> </p>
<p align="center">图3 圆盘图案</p>
<h3>4.顶点在圆周上的连续线段</h3>
<p> 前面例子中,圆周上取点的参数方程的夹角θ都在0~2π之间,若将θ乘以一个参数k,可绘制出一些有趣的图形。编写的HTML文件内容如下。</p>
<p style="margin-left: 30px"><!DOCTYPE html></p>
<p style="margin-left: 30px"><head></p>
<p style="margin-left: 30px"><title>顶点在圆周上的连续线段</title></p>
<p style="margin-left: 30px"><script type="text/javascript"></p>
<p style="margin-left: 30px"> function draw(id)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px"> if (canvas==null)</p>
<p style="margin-left: 30px"> return false;</p>
<p style="margin-left: 30px"> var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px"> context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px"> context.fillRect(0,0,300,300);</p>
<p style="margin-left: 30px"> context.fillStyle = "cyan"; </p>
<p style="margin-left: 30px"> context.strokeStyle = 'red'; </p>
<p style="margin-left: 30px"> context.lineWidth=1;</p>
<p style="margin-left: 30px"> var k=11;</p>
<p style="margin-left: 30px"> var dig=Math.PI/12*k;</p>
<p style="margin-left: 30px"> var radius=100;</p>
<p style="margin-left: 30px"> var dx = 150; </p>
<p style="margin-left: 30px"> var dy = 150; </p>
<p style="margin-left: 30px"> context.beginPath(); </p>
<p style="margin-left: 30px"> var x = radius*Math.sin(0)+dx; </p>
<p style="margin-left: 30px"> var y = radius*Math.cos(0)+dy;</p>
<p style="margin-left: 30px"> context.moveTo(x,y); </p>
<p style="margin-left: 30px"> for(var i = 1; i < 24; i++)</p>
<p style="margin-left: 30px"> { </p>
<p style="margin-left: 30px"> var x = radius*Math.sin(i * dig); </p>
<p style="margin-left: 30px"> var y = radius*Math.cos(i * dig); </p>
<p style="margin-left: 30px"> context.lineTo(dx+x,dy+y); </p>
<p style="margin-left: 30px"> } </p>
<p style="margin-left: 30px"> context.closePath(); </p>
<p style="margin-left: 30px"> context.fill(); </p>
<p style="margin-left: 30px"> context.stroke(); </p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"></script></p>
<p style="margin-left: 30px"></head></p>
<p style="margin-left: 30px"><body onload="draw('myCanvas');"></p>
<p style="margin-left: 30px"><canvas id="myCanvas" width="300" height="300">您的浏览器不支持canvas!</p>
<p style="margin-left: 30px"></canvas></p>
<p style="margin-left: 30px"></body></p>
<p style="margin-left: 30px"></html></p>
<p> 在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出如图4所示的图案。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191223203555168-676093359.png"> </p>
<p align="center">图4 顶点在圆周上的连续线段</p>
<p> 仿图4图形绘制的方法,我们不绘制直线,而是绘制贝塞尔曲线。编写如下的HTML文件。</p>
<p style="margin-left: 30px"><!DOCTYPE html></p>
<p style="margin-left: 30px"><head></p>
<p style="margin-left: 30px"><title>终点分布在圆周上的贝塞尔曲线</title></p>
<p style="margin-left: 30px"><script type="text/javascript"></p>
<p style="margin-left: 30px"> function draw(id)</p>
<p style="margin-left: 30px"> {</p>
<p style="margin-left: 30px"> var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px"> if (canvas==null)</p>
<p style="margin-left: 30px"> return false;</p>
<p style="margin-left: 30px"> var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px"> context.fillStyle="#EEEEDD";</p>
<p style="margin-left: 30px"> context.fillRect(0,0,300,300);</p>
<p style="margin-left: 30px"> context.fillStyle = 'cyan'; </p>
<p style="margin-left: 30px"> context.strokeStyle = 'red'; </p>
<p style="margin-left: 30px"> context.globalCompositeOperation ='and'; </p>
<p style="margin-left: 30px"> context.lineWidth=1;</p>
<p style="margin-left: 30px"> var dig=Math.PI/15*11;</p>
<p style="margin-left: 30px"> var radius=100;</p>
<p style="margin-left: 30px"> var dx = 150; </p>
<p style="margin-left: 30px"> var dy = 150; </p>
<p style="margin-left: 30px"> context.beginPath(); </p>
<p style="margin-left: 30px"> for(var i = 0; i < 30; i++)</p>
<p style="margin-left: 30px"> { </p>
<p style="margin-left: 30px"> var x = radius*Math.sin(i * dig); </p>
<p style="margin-left: 30px"> var y = radius*Math.cos(i * dig); </p>
<p style="margin-left: 30px"> context.bezierCurveTo(dx+x,dy+y-100,dx+x+100,dy+y,dx+x,dy+y); </p>
<p style="margin-left: 30px"> } </p>
<p style="margin-left: 30px"> context.closePath(); </p>
<p style="margin-left: 30px"> context.fill(); </p>
<p style="margin-left: 30px"> context.stroke(); </p>
<p style="margin-left: 30px"> }</p>
<p style="margin-left: 30px"></script></p>
<p style="margin-left: 30px"></head></p>
<p style="margin-left: 30px"><body onload="draw('myCanvas');"></p>
<p style="margin-left: 30px"><canvas id="myCanvas" width="300" height="300">您的浏览器不支持canvas!</p>
<p style="margin-left: 30px"></canvas></p>
<p style="margin-left: 30px"></body></p>
<p style="margin-left: 30px"></html></p>
<p> 在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出如图5所示的图案。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191223203626741-2115507103.png"> </p>
<p align="center">图5 终点分布在圆周上的贝塞尔曲线</p><br><br>
来源:https://www.cnblogs.com/cs-whut/p/12088234.html
頁:
[1]