package
{
import com.Force;
import com.Particle;
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
private var particles:Vector.<Particle>;
public function Main()
{
particles = new Vector.<Particle>();
for(var i:int=0; i<8; i++){
var particle:Particle;
particle = new Particle();
particle.x = 150;
particle.y = 150;
particle.m = 100;
particle.parent = this.stage;
var f1:Force = new Force();
f1.value = 200;
f1.angle = 0 + i *45;
particle.instantForce(f1);
particles.push(particle);
}
this.stage.addEventListener(Event.ENTER_FRAME,onRender);
}
protected function onRender(event:Event):void
{
// TODO Auto-generated method stub
for each(var particle:Particle in particles){
particle.render();
}
}
}
}
vector2d类见本博客
package com
{
public class Force extends Vector2D
{
/**力**/
public function Force()
{
super(0,0);
}
/**力的大小**/
public function set value(value:Number):void{
super.length = value;
}
public function get value():Number{
return super.length;
}
/**力的方向(角度)**/
override public function set angle(value:Number):void{
value = value*(Math.PI/180);
super.angle = value;
}
override public function get angle():Number{
var value:Number = super.angle;
value = value/(Math.PI/180);
return value;
}
/**水平分力**/
override public function get x():Number{
return super.x;
}
/**垂直分力**/
override public function get y():Number{
return super.y;
}
}
}
package com
{
import flash.display.DisplayObjectContainer;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.geom.Point;
/**粒子**/
public class Particle extends Point
{
private var _Vx:Number;
private var _Vy:Number;
private var _m:Number;
private var _ax:Number;
private var _ay:Number;
private var _graphics:Sprite;
private var _parent:DisplayObjectContainer
private var addToStage:Boolean = false;
private var _t:Number;
private var _instantForceVec:Vector.<Force>;
private var _resultantForceVec:Vector.<Force>;
private var _bForceChange:Boolean = false;
public function Particle()
{
this.x = 0;
this.y = 0;
_t = 1;
_Vx = 0;
_Vy = 0;
_ax = 0;
_ay = 0;
_m = 1;
_graphics = new Sprite();
_graphics.graphics.beginFill(0x000000,1);
_graphics.graphics.drawCircle(0,0,5);
_instantForceVec = new Vector.<Force>();
_resultantForceVec = new Vector.<Force>();
}
/**给粒子添加一个瞬时力**/
public function instantForce(F:Force):void{
_bForceChange = true;
_instantForceVec.push(F);
}
/**给粒子添加一个持续力**/
public function continueForce(F:Force):void{
_bForceChange = true;
_resultantForceVec.push(F);
}
public function render():void{
if(addToStage==false && _parent!=null){
_parent.addChild(_graphics);
addToStage = true;
}
if(_bForceChange == true){
composeForce();
}
update();
project();
}
public function update():void{
var Sx:Number = 0;
var Sy:Number = 0;
//v0 = v0 + at
Vx = Vx + ax*t;
Vy = Vy + ay*t;
//s = vt
Sx = Vx*t;
Sy = Vy*t;
this.x+=Sx;
this.y+=Sy;
}
public function project():void{
_graphics.x = this.x;
_graphics.y = this.y;
}
/**计算合力加速度**/
private function composeForce():void{
_bForceChange = false;
ax = 0;
ay = 0;
var F:Force;
var fx:Number;
var fy:Number;
var iax:Number;
var iay:Number;
for each(F in _instantForceVec){
fx = F.x;
fy = F.y;
iax = fx/m;
iay = fy/m;
ax+=iax;
ay+=iay;
_bForceChange = true;
}
_instantForceVec.length = 0;
for each(F in _resultantForceVec){
fx = F.x;
fy = F.y;
iax = fx/m;
iay = fy/m;
ax+=iax;
ay+=iay;
}
}
public function get Vx():Number
{
return _Vx;
}
public function set Vx(value:Number):void
{
_Vx = value;
}
/**分速度Vx**/
public function get Vy():Number
{
return _Vy;
}
/**分速度Vx**/
public function set Vy(value:Number):void
{
_Vy = value;
}
/**质量**/
public function get m():Number
{
return _m;
}
public function set m(value:Number):void
{
_m = value;
}
/**加速度x**/
public function get ax():Number
{
return _ax;
}
public function set ax(value:Number):void
{
_ax = value;
}
/**加速度y**/
public function get ay():Number
{
return _ay;
}
public function set ay(value:Number):void
{
_ay = value;
}
public function get graphics():Sprite
{
return _graphics;
}
public function set graphics(value:Sprite):void
{
_graphics = value;
}
public function get parent():DisplayObjectContainer
{
return _parent;
}
public function set parent(value:DisplayObjectContainer):void
{
_parent = value;
}
public function get t():Number
{
return _t;
}
public function set t(value:Number):void
{
_t = value;
}
}
}