移动的球从静止的球弹起的角度

发布于 2024-10-30 13:53:18 字数 176 浏览 14 评论 0原文

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

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

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

Let there be two balls, one of which is moving about in the Cartesian coordinate plane, while the other is stationary and immobile. At some point, the moving ball collides with the inert ball. Assuming the moving ball is traveling in a straight line, how can one derive the new angle that the moving ball will be propelled given the following information:

The moving ball's center coordinates (X0, Y0), radius (R0), and angle of travel before impact (A0)

The stationary ball's center coordinates (X1, Y1) and radius (R1)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

忆梦 2024-11-06 13:53:18

如果您的第二个球具有无限质量:

在此处输入图像描述

其中 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]}

If your second ball has infinite mass:

enter image description here

Where phi (after a long calc) is:

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]))
           ]

Where:

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

Edit

To determine the whole trajectory, you'll also need the coordinates for the center of the moving ball at the time of impact. They are:

  {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]}
肩上的翅膀 2024-11-06 13:53:18

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);

至少阅读第三页以了解这里发生的情况。

Page 3 of Pool Hall Lessons by Joe van den Heuvel, Miles Jackson gives a great example of how to do this.

// 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);

Read at least page three to understand whats going on here.

泪意 2024-11-06 13:53:18

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

You should take a look at the elastic collision article on wikipedia. I would explain here, but everything I could have said, wikipedia says it better and with clear examples and equations.

梦开始←不甜 2024-11-06 13:53:18

[很久很久以前,我还是一名本科生时就研究过这个问题。 ]

你需要清楚群众。也许您假设两个球的质量相等,而不是其中一个球的质量无限大。

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

你想能够做到这一点吗?

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

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

  • 初始碰撞使移动球“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

[A long, long time ago I studied this as an undergrad. ]

You need to be clear on the masses. Probably you are assuming equal mass for both balls, as opposed to one being of infinite mass.

The second thing is: Are you interested in considering rolling constraints as well as linear momentum. The treatments you will come across which talk along the lines of a simplistic elastic collision ignore all this. As an example, consider shots in pool/ snooker where you deliberately strike the ball away from the midpoint to generate front or backspin.

Do you want to able to do this?

If so, you need to consider the friction between a spinning ball and the surface.

For example in a "simple" straight-on collision between a rolling ball and a stationary one, if we assume perfectly elastic (again not quite true):

  • the initial collision stops the moving ball 'A'
  • the stationary ball 'B' starts moving at the impact speed of 'A'
  • 'A' still has spin, it grips the surface and picks up some small velocity
  • 'B' starts without spin and has to match it to its speed in order to roll. This results in it slowing slightly.

For the simplistic case, the calculation is much easier if you transform to the coordinates of the centre of mass. In that frame, the collision is always a straight-on collision, reversing the direction of the balls. You then just transform back to get the resultants.

Assuming indetical masses and speeds prior to the impact of v1 and w1.

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

Post collision, we have a simple reflection:

v2_prime = -v1_prime  (== w1_prime)
w2_prime = -vw_prime  (== v1_prime)

v2 = v2_prime + V0
w2 = w2_prime + V0
岁吢 2024-11-06 13:53:18

它只是从静止的球反射。因此,计算接触点(球的中心将分开 R0 + R1),反射轴将是连接中心的线。

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

It simply reflects from the stationary ball. So compute the point of contact (the centres of the balls will be R0 + R1 apart) and the axis of reflection will be the line joining the centres.

EDIT: By which I mean the line joining the centres at the point of contact will have an angle, and you can use this angle to help compute the new angle of the moving ball.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文