はじめに
このページでは、以下の作品をベースとして放物運動について説明します。
#つぶやきProcessing 夏の思い出
— Koji Saito (@KojiSaito) June 16, 2020
def setup():size(500,500);noStroke();fill(-1)
def D(n):
x=400;y=500;vy=-.97
for i in range(n):x-=.2;y+=vy;vy+=.001;circle(x,y,random(8/(n-i))+1)
def draw():
clear();f=frameCount*5;D(f);filter(BLUR,3);D(f+7);filter(BLUR,1)#dailycodingchallenge pic.twitter.com/h7F8eMZW84
この作品はロケット花火をモチーフにした作品で、 打ち上げられたあと、重力に引かれて放物運動を行います。
まずは清書版のソースコード
この作品は 1 ツィートの中に作品を収める つぶやき Processing という活動にて 発表したものです。 なので、プログラムが圧縮されています。
まずはここに圧縮前のソースコードを示し、 その後、放物運動の実装について説明を行います:
def setup():
size(500,500)
noStroke()
fill(255)
def DrawParabola(n):
x=400
y=500
vy=-0.97
for i in range(n):
x-=0.2
y+=vy
vy+=0.001
circle(x,y,random(8/(n-i))+1)
def draw():
clear()
f=frameCount*5
DrawParabola(f)
filter(BLUR,3)
DrawParabola(f+7)
filter(BLUR,1)
放物運動の解説
上に示したプログラムで、実際に放物線を描くのは DrawParabola 関数です。 DrawParabola 関数は引数を一つ取り、その引数は放物線の長さを示しています。
draw 関数にて 2 回 DrawParabola 関数が呼ばれていますが、 最初の DrawParabola(f) はぼやけた軌跡のために呼び出されています (このページでは放物運動に着目するので、 filter 関数にて BLUR をかける目的については省略します)。
DrawParabola 関数では、円の集まりとして放物線を描いています。 変数 x,y が描かれる円の位置を示しており、その初期値は (x,y)=(400,500) です。
for ループが 1 回まわる毎に、x の値は 0.2 ずつ減らされていきます (x-=0.2 がその処理)。 つまり、x 軸方向は等速直線運動として実装されています。
y の値は vy ずつ増加しています。 この vy は y 方向の速度(velocity of y)を示しており、 その初期値は -0.97 です。
この vy が全く変化しない場合は、速度は変化しません。 つまりこの場合、y 軸方向の運動は等速運動となります。
しかし、ループ内の vy+=0.001 という処理により、 y 方向の速度 vy が変化します。 この 0.001 という値は速度に加え続けられるものであり、 これを加速度と呼びます。
vy は、最初は -0.97 という値でしたが、0.001 という値が加え続けられますので、 やがて 0 になり、そして正の値へと変化していきます。
このように、速度に加え続けられる値(=加速度)が等しい運動を 等加速度運動と呼びます。 プログラムの実行結果をみても分かるように、 放物運動は等加速度運動に他なりません。
まとめ
今回、例として示した作品では打ち上げられたロケット花火を 自由落下として表現したかったため、等加速度運動=放物線として実装しています。
速度を vy のような変数に格納し、 その速度に定数を加え続けると等加速度運動となります。 初速を引力(重力)とは反対方向に向けて設定し、 引力の値を加速度として等加速度運動すれば物を放り投げた運動=放物運動になります。
なお、vy の初期値や 0.001 という加速度の値は、 実際にプログラムを動かし、どのような表現が得られるのか試行錯誤の末に決定しています。 物理的な意味があるわけではありません。