開発環境 Apache Flex SDK 4.13.0
FlashDevelop 4.7.1.1
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 ActionScript 3/AS3 Project
プロジェクト名 parabola2


Main.as
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);
			}
		}
 
	}
 
}
 
最終更新:2015年01月22日 09:53