|開発環境|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); } } } } }}