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