お正月におこたでぬくぬくしながらスクリプト書いてみました。
そのまえに計算式の説明します。スクリプトは最後です。
------------------------------------------------
変数を次のように定義する
重力加速度:g
t秒後(tフレーム後)の移動距離:x,y
射出時の初速:v0
発射角度:r [rad]
ただし上向きを正とする。
したがって重力加速度gは g<0 である。
着弾点は射出点との高低差0とする。
時刻tのときの距離座標x,yは次式のようになる。
x = vx0 * t
y = 1/2*g*t^2 + vy0 * t
着弾点と射出点は高低差0なので y = 0 のときの t を求める
(なお高低差0以外ならy=高低差として計算すれば良い。)
0 = 1/2*g*t^2 + vy0 * t
= t(1/2*g*t + vy0)
(1/2*g*t + vy0) = 0
1/2*g*t = -vy0
t = -vy0 * 2/g
y = 0となるtは、
t = 0
t = -vy0 * 2/g
t = 0は射出時なので、t = -vy0 * 2/g となる。
このときxは
x = vx0 * t
= vx0 * -vy0 * 2/g
射出角をrとしたとき
vx0 = v0 * cos(r)
vy0 = v0 * sin(r)
したがってxは次のようになる。
x = -v0^2 * cos(r) * sin(r) * 2/g
r が決まれば距離 x を算出することができる。
しかし求めたいものは x が決まっている場合の r なので、この式から r を算出する。
x = -v0^2 * cos(r) * sin(r) * 2/g
cos(r) * sin(r) = x / (-v0^2) * g/2
ここで加法定理
sin(x+y) = sin(x) * cos(y) + cos(x) * sin(y)
y=xの場合
sin(2*x) = 2 * sin(x) * cos(x)
1/2 * sin(2*x) = sin(x) * cos(x)
したがって
cos(r) * sin(r) = x / (-v0^2) * g/2
1/2 * sin(2*r) = x / (-v0^2) * g/2
sin(2*r) = x / (-v0^2) * g
2 * r = asin( x / (-v0^2) * g )
r = 1/2 * asin( x / (-v0^2) * g )
となり角度を求めることができる。r は複数無限に出るがどれを用いても良い。
尚HSP3のasin関数なら解は1個出てくる。
解が出るかどうかの判定は次の式からわかる。
sin(2*r) = x / (-v0^2) * g
-1 <= sin(2*r) <= 1
なので
-1 <= x / (-v0^2) * g <= 1
が満たされれば算出可能で有効射程距離。
-------------------
以上説明終わり。
ということで、スクリプト書いてみたのでスクリプトは長いのでこーどったーに上げてみました。
http://codetter.com/?p=1157