パソコン活用研究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"

空気抵抗があるので、実際の地球上ではこんなに飛ばない








TOP PAGE >Basic活用研究目次