パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
2次関数を描いてみる
(準備中)
前回は1次関数(直線)のプログラムについて説明しましたが(グラフィックの基本2)
今回は2次関数を描いてみます。
以下のプログラムはN88互換BASIC For Win上で動かしています。
まずはオーソドックスにy=x*x を計算して描画。
100〜120行は描画のためのサブルーチンです。
デカルト座標系(x軸は右に行くと値が増え、y軸は上に行くと値が増える)から
スクリーン座標系(x軸は右に行くと値が増え、y軸は下に行くと値が増える)への変換を
行いつつ、見やすいグラフにするため、x座標は倍にして描画しています。
<quadratic_func.bas>
10 cls 20 for x=-19 to 19 30 y=x*x 40 gosub 100 50 pset(px,py) 60 next 70 end 100 px=x*2+100 110 py=400-y 120 return
上記のプログラム(quadratic_func.bas)だとy軸方向の点の間隔があきすぎてしまうので、
y軸方向は縮めてみた。→110行目
xの値も -60<=x<=60 と範囲を広げている。
<quadratic_func2.bas>
10 cls 20 for x=-60 to 60 30 y=x*x 40 gosub 100 50 pset(px,py) 60 next 70 end 100 px=x+100 110 py=400-y/10 120 return
もっと間隔をつめるために、媒介変数tを使って、0.2刻みの計算にしてみる。
xの範囲は、-20<=x<=20 になる。
10 cls 20 for i=0 to 200 30 t=i/5-20 40 x=int(t) 50 y=int(t*t) 60 gosub 100 70 pset(px,py) 80 next 90 end 100 px=x*2+100 110 py=400-y 120 return
だいぶ緻密なグラフになった。
ボールを投げたり、大砲の弾を撃った時の放物線の軌跡を描いてみる。
速度は60m/s、投げ出す角度は45°とした。
15行目のvx,vyはx軸方向(水平方向)、y軸方向(垂直方向)の初速。
20行目 t=1/20としているが、これは0.05秒づつ計算するため。
50行目 y軸方向(垂直方向)には重力により毎秒9.8m/S2の加速度が加わり速度が変化する
40,60行目のx,yはボールor大砲の弾の位置になる。
10 cls 15 vx=60*cos(3.14/4):vy=60*sin(3.14/4) 20 t=1/20 30 for i=0 to 173 40 x=x+vx*t 50 vy1=vy:vy=vy-9.8*t 60 y=y+(vy1+vy)/2*t 70 gosub 100 80 pset(px,py) 90 next 95 end 100 px=int(x*2) 110 py=int(300-y*2) 120 return
ついでに、初速と角度を与えたら、投げ出したボールorr大砲の弾等が地上に落下するまでの時間(秒数)と
着地点までの距離を計算するプログラム。
もちろん数学的な計算式を与えれば一発で計算できるが、ここでは、上記のプログラムと同じアルゴリズムで
順次位置を求めていき、y座標が負になった時点(地面に落下した時点)でループを抜けるというコンピュータの
得意な方法で求めてみた。
10 cls 20 input "時速";v 30 input "角度";r 40 vx=v/3.6*cos(3.14/180*r):vy=v/3.6*sin(3.14/180*r) 50 t=1/100:i=0 60 while(1) 70 vy1=vy:vy=vy-9.8*t 80 y=y+(vy1+vy)/2*t 90 if y<0 then goto 200 100 i=i+1 110 wend 200 print i*t;"秒 ";vx*i*t;"m"
空気抵抗があるので、実際の地球上ではこんなに飛ばない