「Flex/parabola2」の編集履歴(バックアップ)一覧に戻る

Flex/parabola2 - (2015/01/22 (木) 09:53:32) のソース

|開発環境|Apache [[Flex]] SDK 4.13.0|
||FlashDevelop 4.7.1.1|
|実行環境|Microsoft Windows 8.1 (64bit)|
|プロジェクトの種類|ActionScript 3/AS3 Project|
|プロジェクト名|parabola2|
#table_zebra(project, #fff, #eee)

http://www.maroon.dti.ne.jp/lance/flash/parabola2.html

Main.as
#highlight(actionscript){{
package
{
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	import mx.utils.StringUtil;
	
	public class Main extends Sprite 
	{
		private const xmax:Number = 640;
		private const ymax:Number = 480;
		private const g:Number = 9.8; // 重力加速度 m/s^2
		private const v0:Number = 30; // 初速 30m/s = 108km/h
		private const a0:Number = 45 * Math.PI / 180; // 角度
		private const p:Number = 5; // 倍率
		private const dt:Number = 0.1; // s

		private var gr:Graphics;
		
		public function Main() 
		{
			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
			
			var canvas:Sprite = new Sprite;
			addChild(canvas);
			gr = canvas.graphics;
			
			// 補助線
			gr.lineStyle(1, 0x000000);
			gr.moveTo(0, 0);
			gr.lineTo(0, ymax);
			gr.lineTo(xmax, ymax);
			
			draw1();
			draw2();
		}
		
		private function draw1():void 
		{
			const vx:Number = v0 * Math.cos(a0);
			const vy:Number = v0 * Math.sin(a0);

			gr.lineStyle(1, 0xff0000);
			gr.moveTo(0, ymax);
			for (var t:Number = dt; ; t += dt) 
			{
				var x:Number = vx * t;
				var y:Number = vy * t - g * t * t / 2;
				trace(StringUtil.substitute("t:{0} x:{1} y:{2}",
					t.toFixed(2), x.toFixed(2), y.toFixed(2)));
				if (y < 0) break;
				gr.lineTo(x * p, ymax - y * p);
			}
		}
		
		private function draw2():void 
		{
			var v:Number = v0; // 速度
			var a:Number = a0; // 角度
			var x:Number = 0;
			var y:Number = 0;
			
			gr.lineStyle(1, 0x0000ff);
			gr.moveTo(0, ymax);
			for (var t:Number = dt; ; t += dt) 
			{
				var vx:Number = v * Math.cos(a);
				var vy:Number = v * Math.sin(a);
				vy -= g * dt;
				v = Math.sqrt(vx * vx + vy * vy);
				a = Math.atan2(vy, vx);
				x += vx * dt;
				y += vy * dt;
				trace(StringUtil.substitute("t:{0} x:{1} y:{2} v:{3} a:{4}",
					t.toFixed(2), x.toFixed(2), y.toFixed(2),
					v.toFixed(2), (a * 180 / Math.PI).toFixed(2)));
				if (y < 0) break;
				gr.lineTo(x * p, ymax - y * p);
			}
		}
		
	}
	
}
}}