南冷阴阳手 發表於 2019-12-26 07:56:00

JavaScript动画实例:李萨如曲线

<p>&nbsp; &nbsp; &nbsp; &nbsp; 在“JavaScript图形实例:阿基米德螺线<span style="font-size: 14px">”和“</span>JavaScript图形实例:曲线方程<span style="font-size: 14px">”中,我们学习了利用曲线的方程绘制曲线的方法。如果想看看曲线是怎样绘制出来的,怎么办呢?编写简单的动画,就可以展示指定曲线的绘制过程。</span></p>
<h3>1.李萨如曲线</h3>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 设定李萨如曲线的坐标方程为:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; X=SIN(2θ)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Y=SIN(3θ)&nbsp;&nbsp;&nbsp;&nbsp; (0≤θ≤2π)</p>
<p>&nbsp; &nbsp; &nbsp; <span style="font-family: &quot;times new roman&quot;, times">&nbsp; 将0~2π区间等分512段,取θ的初始值π/256,按曲线方程求得坐标值(x,y),并在当前坐标处通过绘制一个实心圆的方式描点。之后每隔0.02秒,将θ的初始值加π/256后,按曲线方程求得新坐标值(x,y),并在求得的新坐标处再通过绘制一个实心圆的方式继续描点,这样,可以得到动态绘制的李萨如曲线。曲线绘制完成(即θ的值为2π),将画布清除,令θ重新从初值π/256开始继续动画过程。</span></p>
<p style="margin-left: 30px">编写如下的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;&nbsp; var context;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; var i;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var canvas = document.getElementById(id);&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (canvas == null)&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context = canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,300,300);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setInterval(go,20);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp; function go()</p>
<p style="margin-left: 30px">&nbsp;&nbsp; {&nbsp;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle="red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=2;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dig=Math.PI/256;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=150+100*Math.sin(2*i*dig);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=150-100*Math.sin(3*i*dig);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.arc(x, y, 3, 0, 2 * Math.PI);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle = "red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i+1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i&gt;512)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.clearRect(0,0,300,300);</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="300" height="300" style="border:3px double #996633;"&gt;</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"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191226075402891-236963613.gif">&nbsp;&nbsp;</p>
<p align="center">图1&nbsp; 李萨如曲线</p>
<h3>2.阿基米德螺线</h3>
<p style="margin-left: 30px">编写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;&nbsp; var context;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; var i;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var canvas = document.getElementById(id);&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (canvas == null)&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context = canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,300,300);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setInterval(go,20);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp; function go()</p>
<p style="margin-left: 30px">&nbsp;&nbsp; {&nbsp;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle="red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=2;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dig=Math.PI/128;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=150+5*i*dig*Math.sin(i*dig);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=150+5*i*dig*Math.cos(i*dig);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.arc(x, y, 3, 0, 2 * Math.PI);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle = "red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i+1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i&gt;1024)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.clearRect(0,0,300,300);</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="300" height="300" style="border:3px double #996633;"&gt;</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文件,可以看到在浏览器窗口中呈现出阿基米德螺线的动态绘制过程,如图2所示。</p>
<p align="center"><img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191226075428155-133373679.gif">&nbsp;</p>
<p align="center">图2&nbsp; 阿基米德螺线</p>
<h3>3.螺旋线</h3>
<p style="margin-left: 30px">设定螺旋线的坐标方程为:</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp; X=30*COS(θ)+70*COS(θ/4)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp; Y=30*SIN(θ) - 70*SIN(θ/4)&nbsp;&nbsp; (0≤θ≤8π)</p>
<p style="margin-left: 30px">将螺旋线的绘制过程进行动态展示,编写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;&nbsp; var context;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; var i;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; function draw(id)</p>
<p style="margin-left: 30px">&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var canvas = document.getElementById(id);&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (canvas == null)&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context = canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle="#EEEEFF";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillRect(0,0,300,300);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setInterval(go,20);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp; function go()</p>
<p style="margin-left: 30px">&nbsp;&nbsp; {&nbsp;&nbsp;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.strokeStyle="red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.lineWidth=2;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var x = 150+30*Math.cos(i*Math.PI/72) +70*Math.cos(i/4*Math.PI/72);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var y = 150+30*Math.sin(i*Math.PI/72) -70*Math.sin(i/4*Math.PI/72);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.arc(x, y, 3, 0, 2 * Math.PI);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle = "red";</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i+1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i&gt;576)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.clearRect(0,0,300,300);</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="300" height="300" style="border:3px double #996633;"&gt;&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文件,可以在浏览器窗口中看到螺旋线绘制动画,如图3所示。</p>
<p align="center">&nbsp;<img src="https://img2018.cnblogs.com/common/1485495/201912/1485495-20191226075452721-684876125.gif"></p>
<p align="center">图3&nbsp; 螺旋线绘制</p>
<h3>4.七彩花瓣</h3>
<p style="margin-left: 30px">设定四叶花瓣线的坐标方程为:</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp; X=R*COS(2θ)*SIN(θ)</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp; Y= R*COS(2θ)*COS(θ)&nbsp;&nbsp; (0≤θ≤2π)</p>
<p style="margin-left: 30px">按这个方程,可以绘制如图4所示的四叶花瓣线。</p>
<p align="center"><img src="https://img2018.cnblogs.com/i-beta/1485495/201912/1485495-20191226075515361-2001237860.png">&nbsp;</p>
<p align="center">图4 四叶花瓣线</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 将四叶花瓣线的绘制过程进行动态展示,并且每绘制一个新点,填充颜色在7中颜色间进行切换,这样绘制出七彩花瓣。编写HTML文件如下。</p>
<p style="margin-left: 30px">&lt;!DOCTYPE&gt;</p>
<p style="margin-left: 30px">&lt;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;/head&gt;</p>
<p style="margin-left: 30px">&lt;body &gt;</p>
<p style="margin-left: 30px">&lt;canvas id="myCanvas" width="400" height="300" style="border:3px double #996633;"&gt;</p>
<p style="margin-left: 30px">&lt;/canvas&gt;</p>
<p style="margin-left: 30px">&lt;script&gt;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; var canvas = document.getElementById('myCanvas');</p>
<p style="margin-left: 30px">&nbsp;&nbsp; var context = canvas.getContext('2d');</p>
<p style="margin-left: 30px">&nbsp;&nbsp; var i=0;j=0.05,t=0;</p>
<p style="margin-left: 30px">&nbsp;&nbsp; var colors=new Array('red','orange','yellow','green','cyan','blue','purple');</p>
<p style="margin-left: 30px">&nbsp;&nbsp; function timing() {</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t=t+1;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i+j;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var r=120*Math.cos(2*i);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(t&gt;6){t=0;}</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var x=200+r*Math.sin(i);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var y=150+r*Math.cos(i);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.beginPath();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.arc(x,y,5,0,2*Math.PI);</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fillStyle=colors;</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.fill();</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i&gt;6.3){j=-0.05;context.clearRect(0,0,400,300);}</p>
<p style="margin-left: 30px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i&lt;0){j=0.05;context.clearRect(0,0,400,300);}</p>
<p style="margin-left: 30px">&nbsp;&nbsp; }</p>
<p style="margin-left: 30px">&nbsp;&nbsp; window.setInterval('timing()',200);</p>
<p style="margin-left: 30px">&lt;/script&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/common/1485495/201912/1485495-20191226075546303-1853817270.gif"></p>
<p align="center">图5&nbsp; 七彩花瓣</p><br><br>
来源:https://www.cnblogs.com/cs-whut/p/12100116.html
頁: [1]
查看完整版本: JavaScript动画实例:李萨如曲线