がxTarget/yTarget
ターゲットのxProj/yProj
位置、発射体の初期位置、および発射体v
の初期速度(メートル/秒)である場合、式は次の擬似コードに変換されます。
x = xTarget - xProj;
y = yTarget - yProj;
g = 9.8;
tmp = pow(v, 4) - g * (g * pow(x, 2) + 2 * y * pow(v, 2));
if tmp < 0
// no solution
else if x == 0
angle1 = pi/2;
if y < 0
angle2 = -pi/2;
else
angle2 = pi/2;
end
else
angle1 = atan((pow(v, 2) + sqrt(tmp)) / (g * x));
angle2 = atan((pow(v, 2) - sqrt(tmp)) / (g * x));
end
g
は重力定数(〜9.8 m / s ^ 2)、atan
はアークタンジェント関数、pow
はべき関数です。数式には解がない(ターゲットが初速度で到達できない場合)、1つの解(then )、または2つの解(このアニメーションangle1 == angle2
で見られるように)がないため、ifステートメントが必要です。これがあなたが持っている理由でもあります式の+/-記号)。
ほとんどのプログラミング言語では、も見つかりますatan2
。その場合、一部のコードを次のように置き換えることができます。
if tmp < 0
// no solution
else
angle1 = atan2(pow(v, 2) + sqrt(tmp), g * x);
angle2 = atan2(pow(v, 2) - sqrt(tmp), g * x);
end