えいまぼJEブログ

Minecraft Java Editionに関していろいろ書きます

TNT64個長距離チャレンジの最大飛距離の求め方

経緯

BongoBongoさんより、TNT64個でなるべく飛ぶTNTキャノンを作るチャレンジが開催されました。 面白そうだと思ったので、まずは限界を見極めるため最大飛距離を求めることにしました。

最大飛距離を求める

飛距離の最大値を求める前に、 V _ xの最大値を求めます。

 V _ yの最大値

まずは V _ yを考えます。  T = 79 (爆発の1gt前)で弾頭のy座標が発射地点より1ブロック低くなるようにすると、飛距離が最長になります。このときの V _ yは定数として求められます。飛距離の公式*1から、以下のように計算します。


\begin{align}
\displaystyle y &= y _ 0 + 50 \times (N V _ y + v _ {0y} + 1.96) \times (1 - 0.98 ^ T) - 2 T \\\
\to \displaystyle - 1 &= 50 \times (64 \times V _ y + 0.2 + 1.96) \times (1 - 0.98 ^ {79}) - 2 \times 79 \\\
\to \displaystyle V _ y &= \frac{1}{64} \left( \frac{ 2 \times 79 - 1 }{ 50 \times (1 - 0.98 ^ {79}) } - 0.2 - \displaystyle 1.96 \right) \\\
&= 0.027786... \tag{1}
\end{align}
\

 v _ {0y} = 0.2は、TNT着火時に与えられるy方向の速度です。

 X Yの関係式

 V _ yが求まったので、 X Yの関係式が作れます。


\begin{align}
\displaystyle V _ y &= \left(1 - \frac{R}{8} \right) \frac{Y}{R} \\\
\displaystyle         &= \left(\frac{1}{R} - \frac{1}{8} \right) Y \\\
\to \displaystyle  R                              &= \frac{1}{ \frac{V _ y}{Y} + \frac{1}{8} } \\\
\to \displaystyle  \sqrt{X ^ 2 + Y ^ 2} &= \frac{1}{ \frac{V _ y}{Y} + \frac{1}{8} } \\\
\to \displaystyle  X ^ 2 + Y ^ 2 &= \frac{1}{\left( \frac{V _ y}{Y} + \frac{1}{8} \right) ^ 2} \\\
\to \displaystyle  X                    &= \sqrt{ \frac{1}{\left( \frac{V _ y}{Y} + \frac{1}{8} \right) ^ 2} - Y ^ 2} \tag{2} \\\
\end{align}
\

 \displaystyle \frac{dX}{dY}を求める

式2から \displaystyle \frac{dX}{dY}を求めると、式3のようになります。


\begin{align}
\displaystyle  \frac{dX}{dY} &= \sqrt{ \frac{64}{ (8V _ y + Y) ^ 2 } - 1 }
                                                 - \frac{ 64Y }{(8V _ y + Y) ^ 3 \sqrt{ \frac{64}{ (8V _ y + Y) ^ 2 } - 1 }} \tag{3} \\\
\end{align}
\

式3に Y = 0を代入します。0なのは V _ xが最も大きくなる距離だからです。


\begin{align}
\displaystyle  \left. \frac{dX}{dY} \right | _ {Y=0}
                     &= \sqrt{ \frac{64}{ (8V _ y) ^ 2 } - 1 } \\\
\displaystyle &= \sqrt{ \frac{1}{ V _ y^ 2 } - 1 } \\\
\displaystyle &= \frac{1}{a} \tag{4} \\\
\end{align}
\

ここからは Y = 0近傍において


\begin{align}
\displaystyle  Y &= aX \tag{5} \\\
\end{align}
\

といえることを使います。

 V _ xの最大値

残りは V _ xを求めます。


\begin{align}
\displaystyle V _ x &= \left(1 - \frac{R}{8} \right) \frac{X}{R} \tag{6} \\\
\end{align}
\

式5より、 R = \sqrt{X ^ 2 + Y ^ 2} = \sqrt{X ^ 2 + a ^ 2 X ^ 2} = X \sqrt{a ^ 2 + 1} なので、式6は以下のように書き換えられます。


\begin{align}
\displaystyle V _ x &= \left(1 - \frac{R}{8} \right) \frac{X}{R} \\\
\displaystyle         &= \left(1 - \frac{X \sqrt{a ^ 2 + 1}}{8} \right) \frac{X}{X \sqrt{a ^ 2 + 1}} \\\
\displaystyle         &= \left(1 - \frac{X \sqrt{a ^ 2 + 1}}{8} \right) \frac{1}{\sqrt{a ^ 2 + 1}} \\\
\end{align}
\

 X = 0なので、


\begin{align}
\displaystyle V _ x &= \frac{1}{\sqrt{a ^ 2 + 1}} \tag{7} \\\
\end{align}
\

となります。 X = 0としたのは、 Y = 0のときと同様で V _ xが最も大きくなる距離だからです。

式7に式4を適用します。


\begin{align}
\displaystyle V _ x &= \frac{1}{\sqrt{a ^ 2 + 1}} \\\
\displaystyle          &= \sqrt{1 - V _ y ^ 2} \tag{8} \\\
\end{align}
\

式8に式1を代入します。


\begin{align}
\displaystyle V _ x &= 0.99961... \\\
\end{align}
\

以上より、 V _ xの最大値を求められました。

飛距離の最大値

あとは V _ xの最大値をx座標の飛距離の公式に代入するだけです。


\begin{align}
\displaystyle x &= 50 \times (N V _ x + v _ {0x}) \times (1 - 0.98 ^ T) \\\
\displaystyle    &= 50 \times (64 \times 0.99961 + 0) \times (1 - 0.98 ^ {80}) \\\
\displaystyle    &= 2563.3...
\end{align}
\

最大飛距離は2563.3ブロックでした。

ちなみに、 v _ {0x}TNT着火時に与えられる横方向の速度で、最大0.02、最小-0.02です。水平方向の振幅は0.02で、角度だけランダムです。

着火時の速度も考慮に入れると、最大のときは 50 \times (64 \times 0.99961 + 0.02) \times (1 - 0.98 ^ {80}) = 2564.1... ブロック、最小のときは 50 \times (64 \times 0.99961 - 0.02) \times (1 - 0.98 ^ {80}) = 2562.5... ブロック飛びます。

余談

 V _ xの導出において式2~7は省略できそうです。まず、式9, 10に初速度の式を再掲します。


\begin{align}
\displaystyle V _ x &= \left(1 - \frac{R}{8} \right) \frac{X}{R} \tag{9} \\\
\displaystyle V _ y &= \left(1 - \frac{R}{8} \right) \frac{Y}{R} \tag{10} \\\
\end{align}
\

式9, 10の2乗和を計算します。


\begin{align}
\displaystyle V _ x ^ 2 + V _ y ^ 2 &= \left(1 - \frac{R}{8} \right) ^ 2 
            \left( \frac{X}{R} ^ 2 + \frac{Y}{R} ^ 2 \right) \\\
\displaystyle &= \left(1 - \frac{R}{8} \right) ^ 2 
            \left( \frac{X ^ 2 + Y ^ 2}{R ^ 2}\right) \\\
\displaystyle &= \left(1 - \frac{R}{8} \right) ^ 2 
            \left( \frac{R ^ 2}{R ^ 2}\right) \\\
\displaystyle &= \left(1 - \frac{R}{8} \right) ^ 2 \tag{11} \\\
\end{align}
\

 X Yも0近傍なので、 R = 0といえます。このとき、式11は式12のように書き換えられます。


\begin{align}
\displaystyle V _ x ^ 2 + V _ y ^ 2 &= 1 \tag{12} \\\
\end{align}
\

式12を変形すると、式8と一致します。 これで証明できているか不安ですが、式が一致するのでありだと思います。たぶん。