【问题标题】:Angle that a moving ball will bounce off of an inert ball运动球从惰性球上反弹的角度
【发布时间】:2011-07-28 19:42:32
【问题描述】:

假设有两个球,其中一个在笛卡尔坐标平面内运动,而另一个静止不动。在某个时刻,运动球与惰性球相撞。假设移动球沿直线运动,根据以下信息,如何推导出移动球将被推动的新角度:

移动球的中心坐标(X0,Y0)、半径(R0)和撞击前的移动角度(A0)

静止球的中心坐标(X1,Y1)和半径(R1)

【问题讨论】:

  • 这与编程无关。
  • Vector Mechanics-101 溢出?
  • Stack Overflow 上有很多球的运动问题,其中一个有大约 70 颗星。这一个与那些相似,但不完全相同。而且由于我现在正在编程,它的编程与我有关。
  • 把它画在纸上,等式就会掉出来。
  • 这里有很多人认为如果不是代码,那么它与编程无关。生活比这复杂得多

标签: java math physics collision


【解决方案1】:

如果你的第二个球的质量是无限的:

其中 phi(经过长时间计算)是:

phi=  -ArcTan[
         ( 2 R^2 Sin[A0] + 2 (YD Cos[A0] - XD Sin[A0]) (2 H Cos[A0] + 
           2 XD Sin[A0]^2 - YD Sin[2 A0]))  /
         ((2 R^2 - XD^2 - 3 YD^2) Cos[A0] + (XD^2 - YD^2) Cos[3 A0] + 
           8 XD YD Cos[A0]^2 Sin[A0] + 4 H Sin[A0] (-YD Cos[A0] + XD Sin[A0]))
           ]

地点:

H   = (R0 + R1)^2 - ((Y0 - Y1) Cos[A0] + (X0 - X1) Sin[A0])^2  
R^2 = (R0 + R1)^2
XD  =  X1 - X0
YD  =  Y1 - Y0

编辑

要确定整个轨迹,您还需要在击球时移动球的中心坐标。他们是:

  {X,Y}= {X1+Sin[A0] ((Y1-Y0) Cos[A0]+ (X0-X1) Sin[A0])-Cos[A0] Sqrt[H],
          Y1+Cos[A0] ((Y0-Y1) Cos[A0]+(-X0+X1) Sin[A0])-Sin[A0] Sqrt[H]}

【讨论】:

  • 谢谢你。我会实现它,看看效果如何。
  • @farm 记得使用 atan2 来规避那些棘手的 +/- Pi 问题
  • @belisarius,那是 AutoCAD 吗?与您的答案一起出现的典型干净 mma 动画在哪里? ;) +1
  • @R. M. 这是Geometry Expressions。具有非准时质量的几何问题通常以复杂的方程告终。在质心系统中,一切总是更容易。但这不是玩游戏的最佳选择:)
  • @belisarius,我对函数进行了编码,它似乎正在生成合理的输出。我如何使用 atan2 和这个? (Java 将其实现为 atan2(double, double))。非常感谢。
【解决方案2】:

Pool Hall Lessons by Joe van den Heuvel, Miles Jackson 的第 3 页给出了一个很好的例子来说明如何做到这一点。

// First, find the normalized vector n from the center of circle1 to the center of circle2
Vector n = circle1.center - circle2.center;
n.normalize();
// Find the length of the component of each of the movement vectors along n. 
float a1 = v1.dot(n);
float a2 = v2.dot(n);

float optimizedP = (2.0 * (a1 - a2)) / (circle1.mass + circle2.mass);

// Calculate v1', the new movement vector of circle1
// v1 = v1 - optimizedP * m2 * n
Vector v1 = v1 - optimizedP * circle2.mass * n;

// Calculate v2', the new movement vector of circle2
// v2 = v2 + optimizedP * m1 * n
Vector v2 = v2 + optimizedP * circle1.mass * n;

circle1.setMovementVector(v1);
circle2.setMovementVector(v2);

至少阅读第三页以了解这里发生了什么。

【讨论】:

    【解决方案3】:

    您应该查看维基百科上的elastic collision 文章。我会在这里解释,但我能说的一切,维基百科都说得更好,而且有清晰的例子和方程式。

    【讨论】:

      【解决方案4】:

      [很久很久以前,我作为一名本科生学习过这个。 ]

      你需要清楚群众。可能您假设两个球的质量相同,而不是一个无限大。

      第二件事是:您是否有兴趣考虑滚动约束以及线性动量。您将遇到的处理方法是简单的弹性碰撞,它们忽略了所有这些。例如,考虑在台球/斯诺克中的击球,您故意将球击离中点以产生前旋或后旋。

      你想这样做吗?

      如果是这样,您需要考虑旋转球与表面之间的摩擦力。

      例如,在滚动球和静止球之间的“简单”直接碰撞中,如果我们假设完全有弹性(同样不完全正确):

      • 初始碰撞停止移动球“A”
      • 固定球“B”开始以“A”的冲击速度移动
      • 'A' 仍然有旋转,它抓住表面并获得一些小速度
      • “B”开始时没有旋转,并且必须与其速度相匹配才能滚动。这会导致它稍微变慢。

      对于简单的情况,如果转换为质心坐标,计算会容易得多。在该帧中,碰撞始终是直接碰撞,反转球的方向。然后,您只需转换回来即可获得结果。

      假设在 v1 和 w1 的影响之前不明确的质量和速度。

      V0 = centre of mass speed = (v1+w1)/2
      v1_prime = v of mass_1 in transformed coords = v1 - V0
      w1_prime = w1 - V0
      

      碰撞后,我们有一个简单的反射:

      v2_prime = -v1_prime  (== w1_prime)
      w2_prime = -vw_prime  (== v1_prime)
      
      v2 = v2_prime + V0
      w2 = w2_prime + V0
      

      【讨论】:

        【解决方案5】:

        它只是从静止的球上反射出来。所以计算接触点(球的中心相距 R0 + R1),反射轴将是连接中心的线。

        编辑:我的意思是在接触点连接中心的线会有一个角度,您可以使用这个角度来帮助计算移动球的新角度。

        【讨论】:

        • 如果中心之间的向量与传入球的速度向量成角度怎么办?您必须转换到“中心”坐标系来计算组件,然后再转换回来。
        • @duffymo 通常这两个向量会成一个角度。然后移动的球将被反转并偏转该角度的两倍。 (如果没有角度,这意味着第一个球直接瞄准了第二个。)
        • 我认为您在 Neil 上的位置,但您需要进行编辑以明确它是接触点的角度。 IE。如果 1 号球在其底部(270 度)点被击中,它将以相反的方向移动,0 号球的接触位置也是如此。
        • 当然0号球会垂直于1号球。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        相关资源
        最近更新 更多