OlduwanSteve の回答に費やされる場合は、ある程度物理的に正確になるようにすることができます。
追放を表すベクトルをいくつか作成します (赤い線)。
最初に、追放を表すベクトルの数を定義します - n とマークします。
合計が Vx になる n 個の数値のセットを取得します。これらの数値は、追放ベクトルの x コンポーネントになります。これは次のように行うことができます (半疑似コード):
SumX = Vx;
for (i = 0; i < n; i++)
{
Ax[i] = -rand(0..SumX); // Ax is the array of all expulsion vectors x components
SumX -= Ax[i];
}
次に、Ay (追放ベクトルの y コンポーネント) を計算します。これは、SumY = 0 であることを除いて、 の計算と非常によく似ています。
ここでは、SumY を n 個の要素に分割する代わりに、最大の y コンポーネントを決定する必要があります。これを選択する最善の方法は、追放ベクトルの最大許容角度を定義し、maxVy = minVx*tan(maxAlpha) を使用して最大 Vy を定義することです。
これで、これを使用して Ay を取得できます (半疑似コード):
SumY = maxVy*2; // The actual range is (-maxVy, maxVy), but using (0, 2*maxVy) is simpler IMO
for (i = 0; i < n; i++)
{
Ay[i] = rand(0..SumY);
SumY -= Ay[i];
}
for (i = 0; i < n; i++)
{
Ay[i] -= maxVy; // Translate the range back to (-maxVy, maxVy) from (0, 2*maxVy)
}
これで、追放ベクトルの x 成分と y 成分の両方の配列が得られました。両方の配列を反復し、要素をペアにしてベクトルを作成します (両方の配列を同じ順序で反復する必要はありません)。
注:
• X がオブジェクトの速度ベクトル (緑の線) に平行になるように、計算で軸を揃えます。
• maxVy の計算は、角度maxAlphaのベクトルが生成されることを保証するものではなく、より大きな角度のベクトルが生成されないことを保証するだけです。• Ay[i] = rand(0..SumY) および Ax[i] = -rand(0..SumX) の行は、サイズ 0 のコンポーネントを持つベクトルにつながる可能性があります。これは厄介なシナリオにつながる可能性があります。そのような場合を処理します (たとえば、「rand がゼロを返す間、もう一度呼び出します」)。