董 娜,俞 欣 (馬鞍山師范高等??茖W校軟件與食品工程系, 安徽 馬鞍山 243000)
基于ActionScript 的彈性運動虛擬實現
董 娜,俞 欣 (馬鞍山師范高等專科學校軟件與食品工程系, 安徽 馬鞍山 243000)
基于ActionScript 編程語言,對一維坐標和二維坐標上從無摩擦力到有摩擦力的彈性運動進行了虛擬實現。研究表明,該程序能準確而直觀地再現彈性運動效果,從而為利用計算機編程技術對物理現象進行準確模擬提供參考。
彈性力學;彈性運動;ActionScript;虛擬技術
計算機技術正在全面進入生產技術、科學研究和社會生活的各個領域,徹底改變著整個人類文明的進程。面向對象(Object Oriented,OO)是上世紀90年代軟件開發方法的主流。ActionScript 3.0 是一種強大的面向對象編程語言,其具有更強的報錯能力,指定類型也更加明確[1]。
求解一個彈性力學問題,應設法確定彈性體中各點的位移、應變和應力等共15個相關函數,但在解決實際問題時,起主要作用的往往是其中幾個函數,因而可以用實驗和數學相結合的方法進行求解[2]。為此,筆者利用ActionScript 3.0對一維、二維彈性運動在一維、二維坐標上的運動狀態進行了模擬,實現了無摩擦力和有摩擦力情況下彈性運動效果,從而為利用計算機編程技術對物理現象進行準確模擬提供參考。
彈性運動是彈性力學的一個重要研究領域,它研究彈性物體在外力作用下產生的運動狀態。當皮球落在地面上,由于自身的重力與地面的反作用力,皮球發生形變而產生彈力使皮球從地面上彈起,皮球運動到一定高度,由于地心引力,皮球落回地面并再次發生形變而彈起。使用可以拖拽的小球作為主體。針對上述情況,將x軸的 0 點作為默認位置,使其具有運動到中心點的彈性,并設置一個變量保存彈性的數值,稱之為“彈性系數”[2]。由于較大的彈性系數會使彈性運動顯得十分僵硬,而較小的彈性系數會使彈性運動更加逼真,因而選用彈性系數為0.1:

根據以上思路,假設targetX為100,取前20幀模擬運動情況(見表1)。
利用ActionScript語言實現小球在一維坐標上的無摩擦彈性運動,Springl.as文件如下:
package {
import flash.display.Sprite;
import flash.events.Event;
public class Spring1 extends Sprite {

表1 無摩擦系數時各變量的變化情況
注:dx表示當前位置與目標位置的距離值;ax表
示加速度;vx表示速度向量。下同。
private var ball:Ball;
private var spring:Number = 0.1;
private var targetX:Number = stage.stageWidth/2;
private var vx:Number = 0;
public function Spring1() {
init();
}
private function init():void {
ball = new Ball();
addChild(ball);
ball.y = stage.stageHeight/2;
addEventListener(Event.ENTER_FRAME,
onEnterFrame);
}
private function onEnterFrame(event:Event):void {
var dx:Number = targetX - ball.x;
var ax:Number = dx * spring;
vx += ax;
ball.x += vx;


表2 有摩擦系數時各變量的變化情況
運行以上代碼后發現,沒有摩擦系數時小球一直在原始點左右徘徊。由于小球每次搖擺時的距離相同,所以速度向量也相同,這樣小球會以同樣速度來回擺動。如果引入摩擦力,運動效果將更加逼真,為此設置 friction 變量,friction∈(0,1),取值為 0.95:
private var friction:Number = 0.95;
為了實現小球在有摩擦力效果下的彈性運動,根據以上代碼,將onEnterFrame函數修改為:
private function onEnterFrame(event:Event):void {
var dx:Number = targetX - ball.x;
var ax:Number = dx * spring;
vx += ax; vx *= friction;
ball.x += vx;
}
根據以上思路,模擬有摩擦彈性運動情況,數據如表2所示。
有摩擦系數時小球橫坐標值的變化情況如表3所示。從表3可以看到,小球的橫坐標值從131幀到140幀將逐漸接近于目標位置100,但是無法到達該位置,這時可以設置一個接近范圍,若小球的橫坐標值在該范圍內,便可將橫坐標目標值賦給小球當前橫坐標,從而使小球完全停止。
與一維彈性運動虛擬相比較,二維坐標彈性運動時加入了Y軸方向的運動,整個運動是在X坐標和Y坐標上進行的。因此,將一維彈性運動時使用的變量分成X坐標和Y坐標2組分量,相關代碼如下:

表3 有摩擦系數時小球橫坐標值的變化情況
package {
import flash.display.Sprite;
import flash.events.Event;
public class Spring2 extends Sprite {
private var ball:Ball;
private var spring:Number = 0.1;
private var targetX:Number
= stage.stageWidth/2;
private var targetY:Number
= stage.stageHeight/2;
private var vx:Number = 0;
private var vy:Number = 0;
private var friction:Number = 0.95;
public function Spring2() {
init();
}
private function init():void {
ball = new Ball();
addChild(ball);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
var dx:Number = targetX - ball.x;
var dy:Number = targetY - ball.y;
var ax:Number = dx * spring;
var ay:Number = dy * spring;
vx += ax;
vy += ay;
vx *= friction;
vy *= friction;
ball.x += vx;
ball.y += vy;

利用以上代碼可以模擬實現二維坐標上具有摩擦力的彈性運動。
基于ActionScript 的編程技術,實現了在一維坐標和二維坐標上的彈性運動,模擬了無摩擦力和有摩擦力條件下的彈性運動。結果表明,該程序能準確而直觀地實現彈性運動效果,從而為利用計算機編程技術對物理現象進行準確模擬提供了一個范例。
[1]朱治國,繆亮,陳艷麗.Flash Action Script 3.0編程技術教程[M].北京:清華大學出版社,2008.
[2]徐芝綸.彈性力學[M].北京:高等教育出版社,2006.
10.3969/j.issn.1673-1409(N).2012.09.036
TP311.1
A
1673-1409(2012)09-N102-03
2012-06-12
安徽省質量工程示范實驗實訓中心基金項目(20101233)。
董娜(1981- ),女,2005年大學畢業,講師,碩士生,現主要從事計算機多媒體技術方面的教學與研究工作。
[編輯] 李啟棟