-3

ビリヤードゲーム:ザ・クエスチョン

答えが B であることはわかっていますが、B である理由がわかりません。誰かが答えを見つけるプロセスを親切に説明したり、シミュレーションを見せたりしてくれれば、それは素晴らしいことです.

ありがとうございました。

4

1 に答える 1

1

テーブルを横切ってボール パスをたどることができます。それを簡単にするポイントは、ボールが45°の方向にスタートすることです。したがって、すべての衝突角度は 45° になります。したがって、ボールの方向ベクトルの 1 つのコンポーネントのみを反転する必要があります。

C# のサンプル コードを次に示します。座標系の原点はテーブルの左下隅にあります。ボールの位置は、バウンディング ボックスの左下隅で測定されます。

int ballX = 0;
int ballY = 0;
int ballWidth = 5;
int tableWidth = 230;
int tableHeight = 130;

int directionX = 1;
int directionY = 1;

while(true)
{
    //the distances that the ball could travel until it collides with a vertical or horizontal border, respectively
    int travelDistanceX, travelDistanceY;
    if (directionX > 0)
        travelDistanceX = tableWidth - ballWidth - ballX;
    else
        travelDistanceX = ballX;

    if (directionY > 0)
        travelDistanceY = tableHeight - ballWidth - ballY;
    else
        travelDistanceY = ballY;

    if(travelDistanceX == travelDistanceY)
    {
        //we found the target pocket:
        Console.WriteLine("Target is located at {0}/{1}.", ballX + travelDistanceX * directionX, ballY + travelDistanceY * directionY);
        break;
    }

    if(travelDistanceX < travelDistanceY)
    {
        //collision with the vertical borders
        ballX += travelDistanceX * directionX;
        ballY += travelDistanceX * directionY;
        directionX *= -1;
    }
    else
    {
        //collision with the horizontal borders
        ballX += travelDistanceY * directionX;
        ballY += travelDistanceY * directionY;
        directionY *= -1;
    }
    Console.WriteLine("Collision at {0}/{1}.", ballX, ballY);
}

コードの結果は次のパスになります。

Collision at 125/125.
Collision at 225/25.
Collision at 200/0.
Collision at 75/125.
Collision at 0/50.
Collision at 50/0.
Collision at 175/125.
Collision at 225/75.
Collision at 150/0.
Collision at 25/125.
Collision at 0/100.
Collision at 100/0.
Target is located at 225/125.

そして(225/125)(実際の位置を得るためにボールの幅を加える)のポケットはBです.

于 2016-03-22T18:41:28.317 に答える