トップページ > Flash入門 > 電場と電位flash(1)

電場とポテンシャル

クーロンポテンシャル中の電子の動き

ソースコード: Main.as

※画像ファイル“ClearBall_red.png”,“ClearBall_blue.pngが必要です。

//************************************************************************
//2012/03/09
//電場とポテンシャル
//Proggramed by Koten-Kairoya
//************************************************************************

package
{
    import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.Bitmap;
    import flash.events.Event;
	import flash.events.MouseEvent;
    import flash.events.TextEvent;
	import Atom;
	import flash.text.*;
	
    //画面サイズと背景色,フレームレートを設定
    [SWF(width = "500", height = "600", frameRate = "60", backgroundColor = "0xf0f8ff")] 
     
    public class Main extends Sprite 
    {
        //画像ファイルを読み込む
        [Embed(source = "./ClearBall_blue.png")]
        public var ClearBall_blue:Class;
        public var electron_Img:Bitmap = new ClearBall_blue();

        [Embed(source = "./ClearBall_red.png")]
        public var ClearBall_red:Class;
        public var atom_Img:Bitmap = new ClearBall_red();

		//−電荷量の絶対値
		public var minus_Q:Number = 1;
		//+電荷量
		public var plus_Q:Number = 1;
		//誘電率(引力係数)
		public var k:Number = 100;
		
		//ポテンシャルのグラフ用スプライト
		public var sp2:Sprite = new Sprite();
		//実空間の部分を覆うスプライト
		public var sp_wall:Sprite = new Sprite();
		//仕切り線用スプライト
        public var sp1:Sprite = new Sprite();    
		
		//+の電荷のクラスをインスタンス化
		public var atom:Atom = new Atom();	
		//−の電荷をインスタンス化
		public var electron:Electron = new Electron();
	
		//Electronの速度
		public var v_e:Number = 2;
		//作用する力
		public var force:Number = 0.1;
		//角度用変数
		public var rad:Number = 0;
		//Electronをう動かす場合の一時保存用変数
		public var temp_x:Number = 0;
		public var temp_y:Number = 0;

		//ポテンシャルのグラフ関係の変数
		public var pot_amplitude:Number = 10000;
		public var pot_offset:Number = 15;
		public var pot_width:Number = 5
		public var atom_width:Number = 15
		 
		//デバッグ用
		//public var spdebug:Sprite = new Sprite();
			
        //main関数
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
         
        //コンストラクタ
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
			
			//ポテンシャルのグラフ用スプライトを表示
			drawPotential(-335);
			sp2.x = -335;
			addChild(sp2);
			addChild(atom_Img);
			atom_Img.y = 170;
			atom_Img.x = 150;
			addChild(electron_Img);
			electron_Img.y = 100;
			electron_Img.x = 350;
			
			//実空間の部分を覆う
			sp_wall.graphics.beginFill(0xfffffcc,1);
			sp_wall.graphics.drawRect(0, 200, 500, 600);
			sp_wall.graphics.endFill();
			addChild(sp_wall);
			
			//区切り線を描画
			sp1.graphics.lineStyle(5, 0x696969);
			sp1.graphics.moveTo(0, 200);
			sp1.graphics.lineTo(500, 200);
			addChild(sp1);

			//電荷の画像を表示
			electron.move(350,400);
			atom.move(150, 400);	
			addChild(atom.sprite);
			addChild(electron.sprite);
	
			//ENTER_FRAMEイベントを登録
			this.stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			//各イベントリスナを登録
			atom.sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			electron.sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			
			//============================================================
			//テキスト
			var tf_pot:TextField = new TextField();
			var tf_real:TextField = new TextField();
			var format:TextFormat = new TextFormat();

			tf_pot.y = 10;
			tf_real.y = 210;
			tf_pot.autoSize = TextFieldAutoSize.LEFT;
			tf_real.autoSize = TextFieldAutoSize.LEFT;
			format.size = 16;
			format.color = 0x000000;
			tf_pot.defaultTextFormat = format;
			tf_real.defaultTextFormat = format;
			tf_real.text = "実空間";
			tf_pot.text = "ポテンシャル(電位)";
			addChild(tf_pot);
			addChild(tf_real);
        }

		//============================================================----
		//ポテンシャルのグラフを描画する関数
		private function drawPotential(pos:int):void
		{
			sp2.graphics.clear();
			sp2.graphics.lineStyle(2, 0x000000);
			for (var i:int = atom_width; i <500; i++ )
			{
				//左側
				sp2.graphics.moveTo((i + pot_width),  calcPot("left", i) );
				sp2.graphics.lineTo((i + 1 + pot_width),  calcPot("left", i + 1));//pot_amplitude * 1 / ((500+atom_width-i) - 1) + pot_offset );
				
				//右側
				sp2.graphics.moveTo((i + 500 - pot_width - atom_width), calcPot("right", i));//pot_amplitude * (1/i) + pot_offset);
				sp2.graphics.lineTo((i + 500 - pot_width - atom_width) + 1,  calcPot("right", i+1));//pot_amplitude * (1/(i+1)) + pot_offset );
			}
			sp2.x = pos;
		}
		
		//ポテンシャルのグラフを生成する関数
		private function calcPot(pos:String, x:Number):Number
		{
			if (pos == "left")
			{
				return pot_amplitude * 1 / (500 + atom_width - x) + pot_offset;
			}
			else if (pos == "right")
			{
				return pot_amplitude * (1 / x) + pot_offset;
			}
			else
			{
				return 0;
			}
		}
	
		//フレームごとの処理
		private function onEnterFrame(e:Event ):void
		{
				temp_x = Math.pow(atom.x - electron.x, 2);
				temp_y = Math.pow(atom.y - electron.y, 2);
				if (electron.x - atom.x > 0)
				{
					electron_Img.x =  Math.sqrt(temp_x + temp_y) + atom.x;
					electron_Img.y = calcPot("right", electron_Img.x - sp2.x - 500 + 45) - 30;
				}
				else
				{
					electron_Img.x = atom.x - Math.sqrt(temp_x + temp_y) ;
					electron_Img.y = calcPot("left", electron_Img.x - sp2.x) - 30;
				}
				
			//ドラッグ中の場合はポテンシャルのグラフを動かすのみ。
			//−電荷が動く処理はしないでreturnする
			if (electron.dragFlag == true || atom.dragFlag == true)
			{
				sp2.x = ( (atom.x - 485) );
				atom_Img.x = atom.x;

				return;
			}

			//electronとatomの画像が重ならないかチェック
			if (Math.sqrt( Math.pow((electron.x - atom.x),2) + Math.pow((electron.y - atom.y),2) ) < 31)
			{
				//加速度と速度を元に戻す
				force = 0;
				v_e = 0;
				temp_x = atom.x - 30 * Math.cos(rad);
				temp_y = atom.y - 30 * Math.sin(rad);
				electron.move(temp_x, temp_y);
				//trace("return")
				return;
			}
			
			force += k/(Math.pow( (electron.x - atom.x),2) + Math.pow((electron.y - atom.y),2));
			v_e += force;			

			//============================================================
			//x,y距離を出しておく
			temp_x = atom.x -electron.x;
			temp_y = atom.y - electron.y;			
			//ElectronからAtomを見た角度を計算
			rad = Math.atan2(temp_y, temp_x);
			//新しいelectronの座標
			temp_x = electron.x + v_e*Math.cos(rad);
			temp_y = electron.y + v_e * Math.sin(rad);
			//Electronを動かす
			electron.move(temp_x, temp_y);
			//============================================================
		}
		
		private function onMouseDown(e:MouseEvent):void
		{
			v_e = 0;
			force = 0;
		}
	}
}

ソースコード: Electron.as

※画像ファイル“ClearBall_blue.png”が必要です。

package  
{
    import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.Bitmap;
    import flash.events.Event;
	import flash.events.MouseEvent;
	
	public class Electron 
	{

		//画像を読み込み
        [Embed(source = "./ClearBall_blue.png")]
        public var ClearBall_blue:Class;
        public var electron_Img:Bitmap = new ClearBall_blue();
		
		//ドラッグ用スプライト
		public var sprite:Sprite = new Sprite();
		
		//ドラッグ時の境界
		public var top:int = 200;
		public var bottom:int = 600;
		public var left:int = 0;
		public var right:int = 470;
		
		//スプライトの座標
		public var x:Number = 0;
		public var y:Number = 0;
		
		//ドラッグ中フラグ
		public var dragFlag:Boolean = false;
		
		public function Electron()
		{
			//スプライトに画像を貼りつける
			sprite.addChild(electron_Img);
			
			//イベントリスナに登録
			sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			sprite.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			sprite.addEventListener(MouseEvent.ROLL_OUT, onMouseRollout);
			sprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
		}
		
		public function move(new_x:Number, new_y:Number):void 
		{
			sprite.x = new_x;
			sprite.y = new_y;
			this.x = new_x;
			this.y = new_y;
		}
		
		private function onEnterFrame(e:Event):void 
		{
			this.x = sprite.x;
			this.y = sprite.y;
		}
		private function onMouseDown(e:MouseEvent):void
		{
			dragFlag = true;
			sprite.startDrag();
		}
		
		private function onMouseUp(e:MouseEvent):void 
		{
			if (dragFlag == true)
			{
				dragFlag = false;
				sprite.stopDrag();
			}
		}

		private function onMouseRollout(e:MouseEvent):void
		{
			//sprite.stopDrag();
		}
		
		private function onMouseMove(e:MouseEvent):void
		{
			if (x < left )
			{
				x = left;
				move(x, y);
				dragFlag = false;
				sprite.stopDrag();
			}
			if (x > right )
			{
				x = right;
				move(x, y);
				dragFlag = false;
				sprite.stopDrag();				
			}
			if (y < top)
			{
				y = top;
				move(x, y);
				dragFlag = false;
				sprite.stopDrag();
			}
			if (y > bottom)
			{
				y = bottom;
				move(x, y);
				dragFlag = false;
				sprite.stopDrag();
			}
		}
		
	}

}

ソースコード: Atom.as

※画像ファイル“ClearBall_red.png”が必要です。

package  
{
    import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.Bitmap;
    import flash.events.Event;
	import flash.events.MouseEvent;
	
	public class Atom 
	{

		//画像を読み込み
		[Embed(source = "./ClearBall_red.png")]
		public var ClearBall_red:Class;
		public var atom_Img:Bitmap = new ClearBall_red();
		
		//ドラッグ用スプライト
		public var sprite:Sprite = new Sprite();
		
		//ドラッグ時の境界
		public var top:int = 200;
		public var bottom:int = 600;
		public var left:int = 0;
		public var right:int = 500;
		
		//スプライトの座標
		public var x:Number = 0;
		public var y:Number = 0;
		
		public var dragFlag:Boolean = false;
		
		public function Atom() 
		{
			//スプライトに画像を貼りつける
			sprite.addChild(atom_Img);
			
			//イベントリスナに登録
			sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			sprite.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			sprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
		}
		
		public function move(new_x:int, new_y:int):void 
		{
			sprite.x = new_x;
			sprite.y = new_y;
		}
		
		private function onEnterFrame(e:Event):void 
		{
			this.x = sprite.x;
			this.y = sprite.y;
		}
		private function onMouseDown(e:MouseEvent):void
		{
			dragFlag = true;
			sprite.startDrag();
		}
		
		private function onMouseUp(e:MouseEvent):void 
		{
			dragFlag = false;
			sprite.stopDrag();
		}
		
		
		private function onMouseMove(e:MouseEvent):void
		{
			if (x < left )
			{
				x = left;
				move(x, y);
				dragFlag = false;
				sprite.stopDrag();
			}
			if (x > right )
			{
				x = right;
				move(x, y);
				dragFlag = false;
				sprite.stopDrag();				
			}
			if (y < top)
			{
				y = top;
				move(x, y);
				dragFlag = false;
				sprite.stopDrag();
			}
			if (y > bottom)
			{
				y = bottom;
				move(x, y);
				dragFlag = false;
				sprite.stopDrag();
			}
		}
	}
}



戻る  次へ