【发布时间】:2016-03-22 17:54:46
【问题描述】:
【问题讨论】:
-
你认为会发生什么?这更像是一个物理问题,除非您想编写一个程序来解决这类问题。在这种情况下,您希望尽可能多地编写程序,然后在此处发布。
-
我投票结束这个问题,因为它与编程无关。
【问题讨论】:
您可以沿着球的路径穿过桌子。让这件事变得简单的一点是,球从 45° 的方向开始。因此,所有的碰撞角度都是 45°。因此,您只需反转球方向矢量的一个分量。
这里是一些 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。
【讨论】: