如何计算直线上移动物体的位置
How to calculate position of a moving object on a line
所以基本上我正在用 C++ 制作台球游戏(某种程度上)。在我开始编码之前,我仍在思考这个理论以及如何准确地实现它,但我有点卡住了。因此,给出了球的起始坐标,并且还给出了关于射门的力量和射门方向的输入坐标。
示例:
> Ball: (280,70)
Input:
> 2(power) 230(x) 110(y)
Output:
> 180(x) 150(y)
幂意味着基本上它会移动 X * 给定坐标的距离。因此,如果它是 1,它只会达到 230 110,但如果它更多,它将变成该距离的两倍、三倍、四倍等。 (应忽略外部因素-摩擦等)
到目前为止,我已经成功地创建了一个算法来找到球将要行进的路线。但我不知道球会停在这条线上的哪一点。任何帮助将不胜感激!
还有一件事,我还需要计算如果它撞到池壁会去哪里 table(池 table 是一个 2:1 具有给定坐标的矩形边缘)而且我还设法找到了它将行进的线,但不是它将停止的确切点。
TL;DR 我需要找到台球停止的行进点。
您可能想要根据正交分量进行工作,基本上根据 deltaX
和 deltaY
来考虑球的位移,而不是寻找它将移动的直线。方便的是,您已经处于直角坐标系中,可以计算 x 和 y 的变化,然后按功率因数缩放它们。例如,此处 deltaX = 2*(280-230)
或 -100
,因此目标将是 280 + -100
,等于 180
。
为了考虑边缘,您将任何方向的运动限制在 4 个边缘内。如果它碰到边缘,你会有一些额外的位移。您可能认为弹跳是将余数取反,然后在给定球撞击边缘的位置加上多余的 deltaX
和 deltaY
时,以幂 1 递归调用 moveBall
函数适当地改变了符号。如果 moveBall
拿了 std::pair<int, int> startingPosition, std::pair<int, int> displacement, int power
,如果它撞到墙上,你会 return moveBall(locationOnEdge, predictedLocationBasedOnExcess, 1)
。此设置将根据需要多次递归调用自身,直到球最终找到其结束位置(球可以多次从边缘反弹)。
例如,如果您在 x = 200 和 y = 100 处有边(意味着您断言的期望输出不同),则剩余的 deltaX 为 -20 和 deltaY 为 50。由于球是向上和向左移动,它会向下和向左弹跳。您会调用 moveBall
,起始位置 (200, 100)、位移 (-20, -50) 和幂 1。
我在这里做了一些猜测,因为你没有定义球从边缘反弹时的预期行为。
所以基本上我正在用 C++ 制作台球游戏(某种程度上)。在我开始编码之前,我仍在思考这个理论以及如何准确地实现它,但我有点卡住了。因此,给出了球的起始坐标,并且还给出了关于射门的力量和射门方向的输入坐标。
示例:
> Ball: (280,70)
Input:
> 2(power) 230(x) 110(y)
Output:
> 180(x) 150(y)
幂意味着基本上它会移动 X * 给定坐标的距离。因此,如果它是 1,它只会达到 230 110,但如果它更多,它将变成该距离的两倍、三倍、四倍等。 (应忽略外部因素-摩擦等)
到目前为止,我已经成功地创建了一个算法来找到球将要行进的路线。但我不知道球会停在这条线上的哪一点。任何帮助将不胜感激!
还有一件事,我还需要计算如果它撞到池壁会去哪里 table(池 table 是一个 2:1 具有给定坐标的矩形边缘)而且我还设法找到了它将行进的线,但不是它将停止的确切点。
TL;DR 我需要找到台球停止的行进点。
您可能想要根据正交分量进行工作,基本上根据 deltaX
和 deltaY
来考虑球的位移,而不是寻找它将移动的直线。方便的是,您已经处于直角坐标系中,可以计算 x 和 y 的变化,然后按功率因数缩放它们。例如,此处 deltaX = 2*(280-230)
或 -100
,因此目标将是 280 + -100
,等于 180
。
为了考虑边缘,您将任何方向的运动限制在 4 个边缘内。如果它碰到边缘,你会有一些额外的位移。您可能认为弹跳是将余数取反,然后在给定球撞击边缘的位置加上多余的 deltaX
和 deltaY
时,以幂 1 递归调用 moveBall
函数适当地改变了符号。如果 moveBall
拿了 std::pair<int, int> startingPosition, std::pair<int, int> displacement, int power
,如果它撞到墙上,你会 return moveBall(locationOnEdge, predictedLocationBasedOnExcess, 1)
。此设置将根据需要多次递归调用自身,直到球最终找到其结束位置(球可以多次从边缘反弹)。
例如,如果您在 x = 200 和 y = 100 处有边(意味着您断言的期望输出不同),则剩余的 deltaX 为 -20 和 deltaY 为 50。由于球是向上和向左移动,它会向下和向左弹跳。您会调用 moveBall
,起始位置 (200, 100)、位移 (-20, -50) 和幂 1。
我在这里做了一些猜测,因为你没有定义球从边缘反弹时的预期行为。