【问题标题】:How to calculate position of a moving object on a line如何计算运动物体在直线上的位置
【发布时间】:2021-12-10 18:10:55
【问题描述】:

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

例子:

> Ball: (280,70)

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

Output:
> 180(x) 150(y)

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

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

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

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

【问题讨论】:

  • 在您的无摩擦世界中,一个台球(没有旋转)会一直移动,直到它遇到(击中)另一个物体,例如保险杠、另一个球或口袋。你投入球的力量(力量)意味着它会在更短的时间内击中目标。没有摩擦,所以没有什么可以减慢球的速度。物理学,我的朋友,物理学。
  • 是的,这是真的。但在这种情况下,就像球通过在线移动到达给定坐标,如果幂为 1,它会停止,但如果它更多,它会在同一条线上继续相同的距离 X(power) 次。
  • 如果我们将其简化为 2D 视图,则 Cue(一条线段)与一个圆接触。 Cue 有大小和方向(向量的物理定义)。由于您很简单,所以圆的方向就是线段“撞击”圆的方向。幅度将应用于圆。更多物理学。
  • 球失去能量(并因此减速)的两种方式是摩擦和非弹性碰撞。如果您不想明确模拟摩擦,那么您可以通过让球的速度从与您的“功率”成比例的某个值开始,然后随着移动距离减小(线性、二次等)来伪造它。
  • @CoryKramer 不错

标签: c++ game-physics billiards


【解决方案1】:

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

为了考虑边缘,您将任何方向的移动限制在 4 个边缘内。如果它撞到边缘,你会有一些额外的位移。您可能会将反弹视为反转一些剩余部分,然后在给定球撞击边缘的位置加上多余的deltaXdeltaY 适当地更改符号时,以幂1 递归调用您的moveBall 函数。如果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。由于球向上移动向左,它会向下和向左反弹。您可以使用起始位置 (200, 100)、位移 (-20, -50) 和功率 1 调用 moveBall

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

【讨论】:

  • 所以如果它碰到边缘我不需要计算角度?还有一件事——如果直径大于 0,这个公式将如何变化,所以它就像一个真正的球,而不仅仅是什么都不移动?
  • 这一切都取决于摩擦。没有它,无论是球还是点都无关紧要,保险杠不会产生旋转,反射角只是Pi - angle of incidence,如果保险杠是弹性的(反弹中的能量损失),则使用简单的守恒弹性碰撞动量,用于设置球与保险杠碰撞后的状态(动量/能量)。
  • 大多数此类问题都可以通过能量 (1/2 * m * v * v) 和动量 (m * v) 来解决。在非弹性情况下,你知道能量和动量都是守恒的,所以你可以写出碰撞前后的能量和动量方程,并将它们设置为彼此相等(例如m0 = m1E0 = E1)来求解大多数未知数。位置可用于导出方向或路径。正如其他人之前提到的,总是所有向量分解为ijk 分量并使用直向量方法求解。比绘制等效三角形要容易得多。
猜你喜欢
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2013-01-15
  • 2013-01-29
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
相关资源
最近更新 更多