摘要 介紹利用Flash的lineTo方法動態生成阻尼振動曲線的過程,此方法比以往duplicateMovieClip的實現方法更加簡單,曲線也更加真實,改善了阻尼振動物理教學課件的效果,提高了課件制作的效率。
關鍵詞 阻尼振動;Flash;課件
中圖分類號 G642 文獻標識碼 B文章編號 1671-489X(2008)18-0070-03
1 引言
隨著網絡的普及和教育技術的發展,多媒體課件被越來越多地應用于課堂教學。物理課件應用于課堂教學中,能使比較抽象的模型和過程直觀形象地表現出來,便于學生觀察和理解,從而提升課堂學習效率。Flash是目前多媒體課件制作的主要軟件,它強大的動畫和交互功能,自由的開發界面深受教學工作者的喜愛。尤其是阻尼振動這一章節的教學,使用Flash模擬彈簧振子動態繪制曲線,在實際教學中有非常好的效果。但是縱觀阻尼振動的課件和介紹其制作的文章,都是使用Flash中的duplicateMovieClip方法繪制阻尼振動圖象。而duplicateMovieClip并非繪圖函數,用該方法繪制圖象不僅復雜低效,而且效果也不理想。其實在Flash中已有專門繪圖的函數lineTo,而該函數卻一直未見用于課件制作。用Flash的繪圖函數組中的lineTo代替duplicateMovieClip完成阻尼振動的課件,不僅可以簡化Flash課件中的曲線繪制,而且能夠改善曲線的圖形效果。
2 兩種繪圖方法的比較
以往Flash制作阻尼振動使用duplicateMovieClip繪制曲線。duplicateMovieClip函數的功能是復制影片剪輯,因此通常的做法是先制作一個影片剪輯(MovieClip)放置在場景中,然后不斷調用duplicateMovieClip方法復制該影片剪輯,并使這些影片剪輯排列成曲線,完成阻尼振動的圖象。這種做法缺陷很明顯,繪制出來的曲線受影片剪輯大小的影響,粗細無法調節。在實踐中影片剪輯往往過大,繪制的曲線過粗,不能精確讀取曲線坐標。在遇到曲率較大的地方,曲線呈現不連續的小圓點。而且每復制一個影片剪輯就要占用一個深度級別,十分占用系統資源。當場景中的影片剪輯數量超過999后,Flash運行就會非常緩慢。用duplicateMovieClip繪制的阻尼振動圖象如圖1所示,阻尼曲線上每一個小圓點都是一個被復制出來的影片剪輯。
lineTo是Flash中專門用于繪制圖形的函數,用lineTo繪制的阻尼振動圖象如圖2所示,曲線十分平滑細膩,而且可以自由地控制曲線的顏色和粗細。
3 阻尼振動原理[1-2]
把豎直懸掛的彈簧振子的質點置于液體之中,質點受彈簧彈性力和液體阻尼力作用,即做振幅不斷減小的振動叫做阻尼振動。
根據牛頓第二定律,合外力
阻尼振動時振子受線形回復力和阻力的共同作用,所以合外力是二者之和。根據力的平衡給出動力學方程
經過整理得到:()
其中β是阻尼因子、是固有頻率。
這是一個常系數線性微分方程。利用微分方程的知識,可以討論這個方程的解,給出3種不同振動狀態,如圖3所示。
1)時,解為,其中
如曲線a所示,阻尼作用較小,振幅隨時間變化按指數規律衰減,稱為弱阻尼。
2)時,解為
如曲線b所示,系統很快地回到平衡位置,稱為臨界阻尼。
3)時,解為
如曲線c所示,偏離平衡位置的位移按指數規律衰減,需要很長時間才會回復到平衡位置,稱為過阻尼。
4 繪制阻尼振動圖象
4.1 lineTo的使用方法在Flash中用于繪圖的方法有9個,如圖4所示,分別是beginFill,beginGradientFill,clear,curveTo,endFill,lineGradientStyle,lineStyle,lineTo和moveTo;除lineGradientStyle外,其余方法在Flash 5版本中已有。這里使用lineTo方法繪制阻尼運動曲線。lineTo的完整格式是MovieClip.lineTo(x, y)
lineTo方法畫線需要以下三行代碼完成:
_root.createEmptyMovieClip(\"a\", 100);
a.lineTo(x,y);
a.lineStyle(1,0xff0000,100)
這三行代碼的作用分別是創建對象、畫線和設置線的屬性。首先用createEmptyMovieClip激活lineTo方法,然后使用lineTo畫線,最后用lineStyle給畫的線設置顏色、寬度和透明度。lineTo(x,y)中的x,y是線的終點坐標,起點坐標由上次lineTo(x,y)確定;lineStyle(1,0xff0000,100)中的“1”是線的粗細程度;“0xff0000”是線的顏色,ff0000表示紅色;“100”是線的透明度。
4.2 弱阻尼振動圖象的制作建立一個單幀的場景,在場景中添加一個按鈕和4個輸入文本框。4個輸入文本框分別設置變量zuni、zhengfu、jiaosudu、xiangwei,并賦上初始值0.05、1、4.5、1.9。然后在按鈕上添加on (press) {}動作,并在該動作內寫入action script代碼。效果如圖5所示,按下按鈕后便繪制出弱阻尼運動曲線。
以下是實現該效果的action script代碼。在代碼的相應位置,給出注釋以說明每一行代碼的作用。
//阻尼運動函數x=A[exp(-βt)]cos(ωt+φ)
//定義zuni 為阻尼β
//定義zhengfu為振幅A
//定義jiaosudu為角速度ω
//定義xiangwei為相位φ
//由于網格大小是18px*18px,Flash場景的橫縱坐標最小單位1px,因此要設置系數擴大橫縱坐標最小單位,使曲線變得美觀
zuni2=Number(zuni)*0.1;
jiaosudu2=Number(jiaosudu)*0.18;
zhengfu2=Number(zhengfu)*18.5;
//創建畫圖對象
_root.createEmptyMovieClip(\"zhuniquxian\", 100);
//初始化自變量i,i即弱阻尼運動方程中的變量t
i=0;
//設置計時器,以間隔20毫秒的速度繪制弱阻尼運動曲線ruozuniyundong
setInterval(ruozuniyundong,20);
//清除原曲線
zuniquxian.clear();
//定義弱阻尼運動曲線方程
function ruozuniyundong(){
//使曲線橫坐標不超過400
if (i<=400){
//ω^2=ω0^2+β^2
jiaosudu3=Math.pow((Math.pow(jiaosudu2,2)-Math.pow(zuni2,2)),0.5)
//變量b即弱阻尼運動方程中的變量x,x=A[exp(-βt)]cos(ωt+φ)
b=0-zhengfu2*Math.pow(Math.E,(-zuni2*i))*Math.cos(jiaosudu3*i+Number(xiangwei))+200;
//zuniquxian.lineStyle()要放在zuniquxian.lineTo()后面,確定坐標點后再著色。
zuniquxian.lineTo(i+25,b);
//lineStyle()開始著色
zuniquxian.lineStyle(1,0xff0000,100);
i=i+1;
};};
}
4.3 臨界阻尼、過阻尼振動曲線和彈簧振子的制作
1)臨界阻尼和過阻尼圖象的繪制方法和弱阻尼運動相同。根據臨界阻尼在Flash中生成曲線(圖6)。
過阻尼在Flash中生成曲線(圖7)。從生成的圖象中可知臨界阻尼在的曲線在極值的右半段和教材上的臨界阻尼圖象符合。如果是制作交互型課件,不僅要使臨界阻尼振動圖象隨著參數β、C1、C2的變化而變化,而且要使Flash只生成極值的右半段,以符合圖3的曲線b。這樣就需要對臨界阻尼求導確定t1值,然后讓Flash只生成,且的圖象,這樣做比較復雜。如果是制作演示實驗用的課件,還有更簡單的方法。臨界阻尼和過阻尼方程復雜,而曲線簡單,可以用已繪制好的曲線為底板,然后利用圖層遮罩功能使曲線逐步顯現。這樣做不僅效果好,而且容易實現。
2)如果是制作交互型課件可以使用MovieClip.xscale,MovieClip.yscale方法控制彈簧的伸縮;用MovieClip.x,MovieClip.y方法控制小球的位置,使彈簧和小球與阻尼振動圖象運動同步。如果是演示課件,左邊動畫部分可利用關鍵幀使彈簧和小球隨著曲線同步運動。這樣做不需要寫代碼,制作簡單,但是只能根據曲線逐幀設置小球和彈簧的運動。阻尼振動的演示實驗的課件效果如圖8所示。
5 結論
lineTo繪圖函數的適用范圍是Flash 5版之后。用lineTo改進后的阻尼振動圖象簡化了代碼,提高了運行效率,而且使得繪制的曲線更為美觀。lineTo方法可以繪制任何復雜的曲線,包括連續的、不連續的曲線。例如用lineTo方法實現duplicateMovieClip方法的效果,只需要在上面的代碼“zuniquxian.lineTo(i+25,b);”前添加“zuniquxian.moveTo(i+24,b);”這一行就可以使連續的曲線打散成點(如圖9所示),效果完全和用duplicateMovieClip實現一樣。只要知道曲線的函數形式,用lineTo方法就可以繪制出該曲線的圖象,例如雙曲線、拋物線、螺旋線等。因此在Flash繪圖中,lineTo方法完全可以代替duplicateMovieClip。
參考文獻
[1]朱坤,李波.應用Flash MX制作阻尼振動動畫[J].西北醫學教育,2005,13(5):505
[2]梁紹榮,管靖.基礎物理學[M].北京:高等教育出版社,2002