刘老汉平安是福 發表於 2019-12-22 19:44:00

JavaScript图形实例:图形的旋转变换

<p>&nbsp; &nbsp; &nbsp; &nbsp; 旋转变换:图形上的各点绕一固定点沿圆周路径作转动称为旋转变换。可用旋转角表示旋转量的大小。</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 旋转变换通常约定以逆时针方向为正方向。最简单的旋转变换是以坐标原点(0,0)为旋转中心,这时,平面上一点P(x,y) 旋转了θ之后,变成点P’(x,y) ,如图1所示。</p>
<p style="text-align: center">&nbsp;<img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191222193736446-1111432929.jpg"></p>
<p align="center">图1 点P逆时针旋转</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 由三角关系可得:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<img src="https://img2018.cnblogs.com/i-beta/1485495/201912/1485495-20191222193753588-315681542.png">&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;平面上一点P(x,y)若按顺时针方向旋转了θ之后,变成点P’(x,y) ,如图2所示。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191222193818966-1336612501.jpg">&nbsp;</p>
<p align="center">图2 点P顺时针旋转</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 由三角关系可得:</p>
<p align="center">&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1485495/201912/1485495-20191222193850405-1431756304.png">&nbsp;</p>
<h3>1.三角形旋转</h3>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 先绘制一个三角形,然后将该三角形依次顺时针旋转45°,90°,135°,180°,225°,270°,315°,可以绘制出一个三角形旋转图案。</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 编写如下的HTML代码。</p>
<p style="margin-left: 30px">&lt;!DOCTYPE html&gt;</p>
<p style="margin-left: 30px">&lt;head&gt;</p>
<p style="margin-left: 30px">&lt;title&gt;三角形旋转&lt;/title&gt;</p>
<p style="margin-left: 30px">&lt;script type="text/javascript"&gt;</p>
<p style="margin-left: 30px">&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; if (canvas==null)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEDD";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,300,300);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle="red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="yellow";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; px1=150;&nbsp; py1=150;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; px2=250;&nbsp; py2=150;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; px3=200;&nbsp; py3=120;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(px1,py1);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(px2,py2);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(px3,py3);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(px1,py1);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; x0=150;&nbsp; y0=150;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 旋转中心</p>
<p style="margin-left: 30px">a=Math.PI/4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 旋转角度</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; for (i=1;i&lt;=7;i++)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx=px1;&nbsp; px1=x0+(px1-x0)*Math.cos(a)+(py1-y0)*Math.sin(a);&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; py1=y0-(tx-x0)*Math.sin(a)+(py1-y0)*Math.cos(a);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx=px2;&nbsp; px2=x0+(px2-x0)*Math.cos(a)+(py2-y0)*Math.sin(a);&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; py2=y0-(tx-x0)*Math.sin(a)+(py2-y0)*Math.cos(a);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx=px3;&nbsp; px3=x0+(px3-x0)*Math.cos(a)+(py3-y0)*Math.sin(a);&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; py3=y0-(tx-x0)*Math.sin(a)+(py3-y0)*Math.cos(a);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(px1,py1);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(px2,py2);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(px3,py3);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(px1,py1);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.closePath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp; }</p>
<p style="margin-left: 30px">&lt;/script&gt;</p>
<p style="margin-left: 30px">&lt;/head&gt;</p>
<p style="margin-left: 30px">&lt;body onload="draw('myCanvas');"&gt;</p>
<p style="margin-left: 30px">&lt;canvas id="myCanvas" width="300" height="300"&gt;您的浏览器不支持canvas!</p>
<p style="margin-left: 30px">&lt;/canvas&gt;</p>
<p style="margin-left: 30px">&lt;/body&gt;</p>
<p style="margin-left: 30px">&lt;/html&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出三角形旋转图案,如图1所示。</p>
<p align="center">&nbsp;<img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191222193932351-131299769.png"></p>
<p align="center">图1&nbsp; 三角形旋转图案</p>
<h3>2.旋转小正方形</h3>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 在Canvas画布中绘制18行18列共324个小正方形(每个小正方形的四个顶点取自半径为10的圆周上的4等分点),每个正方形按计算的旋转角度进行逆时针旋转。</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 编写的HTML文件的内容如下。</p>
<p style="margin-left: 30px">&lt;!DOCTYPE html&gt;</p>
<p style="margin-left: 30px">&lt;head&gt;</p>
<p style="margin-left: 30px">&lt;title&gt;旋转小正方形&lt;/title&gt;</p>
<p style="margin-left: 30px">&lt;script type="text/javascript"&gt;</p>
<p style="margin-left: 30px">&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; if (canvas==null)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,500,400);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="yellow";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle="red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; for (px=-170;px&lt;=170;px+=20)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (py=-170;py&lt;=170;py+=20)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a=Math.abs(px)/170*Math.PI/2;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0;i&lt;=4;i++)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x1=10*Math.cos(i*Math.PI/2);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y1=10*Math.sin(i*Math.PI/2);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2=x1*Math.cos(a)-y1*Math.sin(a);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y2=x1*Math.sin(a)+y1*Math.cos(a);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=px+200+x2;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=py+200-y2;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i==0)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(x,y);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(x,y);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.closePath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();</p>
<p style="margin-left: 30px">&nbsp; }</p>
<p style="margin-left: 30px">&lt;/script&gt;</p>
<p style="margin-left: 30px">&lt;/head&gt;</p>
<p style="margin-left: 30px">&lt;body onload="draw('myCanvas');"&gt;</p>
<p style="margin-left: 30px">&lt;canvas id="myCanvas" width="500" height="400"&gt;您的浏览器不支持canvas!</p>
<p style="margin-left: 30px">&lt;/canvas&gt;</p>
<p style="margin-left: 30px">&lt;/body&gt;</p>
<p style="margin-left: 30px">&lt;/html&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出旋转小正方形图案1,如图2所示。</p>
<p align="center">&nbsp;<img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191222194007146-1277007329.png"></p>
<p align="center">图2&nbsp; 小正方形图案1</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 若将上述代码中的旋转角度计算式“a=Math.abs(px)/170*Math.PI/2;”改写为</p>
<p>“a=Math.sqrt(px*px+py*py)/Math.sqrt(170*170*2)*Math.PI/2+Math.PI/4;”。再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出旋转小正方形图案2,如图3所示。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191222194031773-1358186327.png">&nbsp;</p>
<p align="center">图3&nbsp; 小正方形图案2</p>
<h3>3.六瓣花朵旋转一周</h3>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 先生成六瓣花朵绘制的基础数据。然后按逆时针旋转60°的方式绘制6朵六瓣花,正好构成一个圆周。编写的HTML代码如下。</p>
<p style="margin-left: 30px">&lt;!DOCTYPE html&gt;</p>
<p style="margin-left: 30px">&lt;head&gt;</p>
<p style="margin-left: 30px">&lt;title&gt;六瓣花朵旋转一周&lt;/title&gt;</p>
<p style="margin-left: 30px">&lt;script type="text/javascript"&gt;</p>
<p style="margin-left: 30px">&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; if (canvas==null)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,320,320);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle="blue";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var dig=Math.PI/64;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var x=new Array(129);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var y=new Array(129);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; for (var i=0;i&lt;=128;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 生成六瓣花朵图案的基础数据</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d=50*(1+Math.sin(18*i*dig)/5);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t=d*(0.5+Math.sin(6*i*dig)/2);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=(60+t*Math.cos(i*dig));</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=(60+t*Math.sin(i*dig));</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; for (n=0;n&lt;=5;n++)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0;i&lt;=128;i++)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x1=x*Math.cos(n*Math.PI/3)-y*Math.sin(n*Math.PI/3)+160;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y1=x*Math.sin(n*Math.PI/3)+y*Math.cos(n*Math.PI/3)+160;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i==0)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.moveTo(x1,y1);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bx=x1;&nbsp; by=y1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(x1,y1);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(bx,by);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.closePath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp; }</p>
<p style="margin-left: 30px">&lt;/script&gt;</p>
<p style="margin-left: 30px">&lt;/head&gt;</p>
<p style="margin-left: 30px">&lt;body onload="draw('myCanvas');"&gt;</p>
<p style="margin-left: 30px">&lt;canvas id="myCanvas" width="320" height="320"&gt;您的浏览器不支持canvas!</p>
<p style="margin-left: 30px">&lt;/canvas&gt;</p>
<p style="margin-left: 30px">&lt;/body&gt;</p>
<p style="margin-left: 30px">&lt;/html&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出六瓣花朵旋转一周图案,如图4所示。</p>
<p align="center">&nbsp;<img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191222194110820-1695797247.png"></p>
<p align="center">图4&nbsp; 六瓣花朵旋转一周</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 上面的3个实例均采用图形旋转的坐标计算公式计算后进行旋转图形的绘制。实际上,HTML Canvas API中提供了图形旋转的方法。其调用方法是:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context . rotate(angle)&nbsp;&nbsp;&nbsp; &nbsp;// 图形按给定的弧度angle进行顺时针旋转</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rotate方法旋转的中心始终是canvas的原点。如果要改变它,需要使用translate方法。</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;用rotate方法改写实例1的程序,编写HTML文件如下。</p>
<p style="margin-left: 30px">&lt;!DOCTYPE html&gt;</p>
<p style="margin-left: 30px">&lt;head&gt;</p>
<p style="margin-left: 30px">&lt;title&gt;三角形旋转&lt;/title&gt;</p>
<p style="margin-left: 30px">&lt;script type="text/javascript"&gt;</p>
<p style="margin-left: 30px">&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; if (canvas==null)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEDD";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,300,300);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle="red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="yellow";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.translate(150,150);&nbsp;&nbsp; // 旋转中心</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.save();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; for (var j=0;j&lt;8;j++)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.rotate(Math.PI*2/8);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(0,0);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(100,0);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(50,-30);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(0,0);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.closePath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.restore();</p>
<p style="margin-left: 30px">&nbsp; }</p>
<p style="margin-left: 30px">&lt;/script&gt;</p>
<p style="margin-left: 30px">&lt;/head&gt;</p>
<p style="margin-left: 30px">&lt;body onload="draw('myCanvas');"&gt;</p>
<p style="margin-left: 30px">&lt;canvas id="myCanvas" width="300" height="300"&gt;您的浏览器不支持canvas!</p>
<p style="margin-left: 30px">&lt;/canvas&gt;</p>
<p style="margin-left: 30px">&lt;/body&gt;</p>
<p style="margin-left: 30px">&lt;/html&gt;</p>
<h3>4.风车图案</h3>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 将一个梯形按顺时针旋转90°的方式绘制4次,可以绘制出一个风车图案。编写HTML文件如下。</p>
<p style="margin-left: 30px">&lt;!DOCTYPE html&gt;</p>
<p style="margin-left: 30px">&lt;head&gt;</p>
<p style="margin-left: 30px">&lt;title&gt;风车的绘制&lt;/title&gt;</p>
<p style="margin-left: 30px">&lt;script type="text/javascript"&gt;</p>
<p style="margin-left: 30px">&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; if (canvas==null)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,300,300);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.translate(150,150);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.save();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle = 'green';</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; for (var j=0;j&lt;4;j++)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.rotate(Math.PI*2/(4));</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.moveTo(-20,-80);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(0,-80);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(0,0);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineTo(-30,0);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.closePath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.restore();</p>
<p style="margin-left: 30px">&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&lt;/script&gt;</p>
<p style="margin-left: 30px">&lt;/head&gt;</p>
<p style="margin-left: 30px">&lt;body onload="draw('myCanvas');"&gt;</p>
<p style="margin-left: 30px">&lt;canvas id="myCanvas" width="300" height="300"&gt;您的浏览器不支持canvas!</p>
<p style="margin-left: 30px">&lt;/canvas&gt;</p>
<p style="margin-left: 30px">&lt;/body&gt;</p>
<p style="margin-left: 30px">&lt;/html&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出风车图案,如图5所示。</p>
<p align="center">&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1485495/201912/1485495-20191222194308734-680005075.png">&nbsp;</p>
<p align="center">图5&nbsp; 风车图案</p>
<h3>5.七彩圆盘</h3>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 通过旋转绘制圆的方式,可以绘制出一个七彩圆盘图案。编写HTML文件如下。</p>
<p style="margin-left: 30px">&lt;!DOCTYPE html&gt;</p>
<p style="margin-left: 30px">&lt;head&gt;</p>
<p style="margin-left: 30px">&lt;title&gt;七彩圆盘&lt;/title&gt;</p>
<p style="margin-left: 30px">&lt;script type="text/javascript"&gt;</p>
<p style="margin-left: 30px">&nbsp; var colors = ['red','orange', 'yellow', 'green', 'cyan','blue', 'purple' ];</p>
<p style="margin-left: 30px">&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var canvas=document.getElementById(id);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; if (canvas==null)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; var context=canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,400,300);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; context.translate(200,150);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; for (var i=1;i&lt;8;i++)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.save();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle = colors;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var j=0;j&lt;i*7;j++)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.rotate(Math.PI*2/(i*7));</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.arc(0,i*20,8,0,Math.PI*2,true);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.restore();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&lt;/script&gt;</p>
<p style="margin-left: 30px">&lt;/head&gt;</p>
<p style="margin-left: 30px">&lt;body onload="draw('myCanvas');"&gt;</p>
<p style="margin-left: 30px">&lt;canvas id="myCanvas" width="400" height="300"&gt;您的浏览器不支持canvas!</p>
<p style="margin-left: 30px">&lt;/canvas&gt;</p>
<p style="margin-left: 30px">&lt;/body&gt;</p>
<p style="margin-left: 30px">&lt;/html&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出七彩圆盘图案,如图6所示。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191222194338973-2068122941.png">&nbsp;</p>
<p align="center">图6 七彩圆盘</p><br><br>
来源:https://www.cnblogs.com/cs-whut/p/12080773.html
頁: [1]
查看完整版本: JavaScript图形实例:图形的旋转变换