0

所以基本上我在 C++ 上制作一个台球游戏(有点)。在我开始编码之前,我仍在思考这个理论以及如何准确地实现它,我有点卡住了。因此,给出了球的起始坐标,并且还给出了关于射门的功率以及带有坐标的射门方向的输入。

例子:

> Ball: (280,70)

Input:
> 2(power) 230(x) 110(y)

Output:
> 180(x) 150(y)

幂意味着基本上它会走 X * 给定坐标的距离。因此,如果它是 1,它只会达到 230 110,但如果它更多,它将成为该距离的两倍、三倍、四倍等。(应忽略外部因素 - 摩擦等)

到目前为止,我已经设法创建了一个算法来找到球将要经过的路线。但我不知道球会停在这条线的哪一点。任何帮助将不胜感激!

还有一件事,我还需要计算如果撞到台球桌的墙壁会去哪里(台球桌是一个 2:1 的矩形,具有给定的边缘坐标),我还设法找到了它的位置会继续前进,但不是它停止的确切点。

TL; DR 我需要找到台球将停在的行进线点。

4

1 回答 1

0

您可能希望根据正交分量工作,基本上考虑球的位移,deltaXdeltaY不是找到它会行进的线。方便的是,您已经处于直角坐标中,可以计算 x 和 y 的变化,然后按功率因数缩放它们。例如,这里,deltaX = 2*(280-230)-100,所以目的地将是280 + -100,等于180

为了考虑边缘,您将任何方向的移动限制在 4 个边缘内。如果它撞到边缘,你会有一些额外的位移。您可能将反弹视为反转一些剩余部分,然后moveBall在给定球撞击边缘的位置加上多余的位置deltaXdeltaY适当地更改符号时,使用幂 1 递归调用您的函数。如果moveBall拿了std::pair<int, int> startingPosition, std::pair<int, int> displacement, int power,如果它撞到墙上,你会回来的moveBall(locationOnEdge, predictedLocationBasedOnExcess, 1)。此设置将根据需要递归调用自身多次,直到球最终找到其结束位置(球可以多次从边缘反弹)。

例如,如果您在 x = 200 和 y = 100 处有一条边(这意味着您断言的所需输出不同),那么您将有剩余的 deltaX 为 -20 和 deltaY 为 50。由于球向上移动并到达左,它会向下和向左反弹。你会moveBall用起始位置(200、100)、位移(-20、-50)和幂 1 调用。

我在这里做一些猜测,因为您没有定义球从边缘反弹时的预期行为。

于 2021-12-10T20:13:11.257 回答