- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小型物理程序,其中包含大量大小和质量相同的球,这些球在 2D 空间中弹跳。我遇到的问题是,在大多数碰撞之后,动量会增加,但有时会减少。
public static void Collide(Ball b1, Ball b2)
{
Vector2 dist = b2.Position - b1.Position;
float distance = dist.Length();
Vector2 normal = dist * (1 / distance); //get collision normal
float dotprod = Vector2.Dot(normal, b1.Velocity - b2.Velocity);
Vector2 impulse = normal * dotprod; //compute the impulse in the direction of our normal
//ball positions at collision: (.7071, 0.2929); (1,0)
//initial velocities: (2, 0); (0, 0) : total momentum = 2
b1.Velocity -= impulse;
b2.Velocity += impulse;
//new velocities: (1,1); (1, -1) : total momentum = ~2.828
}
这是我简化后的碰撞算法,因为所有球的大小和质量都相同。我尝试了几种不同的算法,它们都产生了相同的结果。在一个有 100 个球的系统中,当我从 1 个动量为 10 的球(弹性壁,无摩擦)开始时,系统的总动量上升到大约 90 并趋于平稳。根据我尝试过的算法数量,似乎这就是它应该的工作方式,但这似乎违反了动量守恒?
我尝试过的一些算法: http://www.vobarian.com/collisions/2dcollisions2.pdf (来自维基百科)和 Ball to Ball Collision - Detection and Handling
最佳答案
您似乎错误地将单个动量的大小之和误认为是总动量本身。质点的动量是一个矢量:
p = m.v
总动量是所有单个动量的向量总和:
P = ∑ mi.vi = m ∑ vi
(在你的情况下所有质量都相等)
动能是一个标量:
K = (1/2) m.v2 = p2 / (2m)
总动能又是所有单个动能的总和:
K = ∑ (1/2) mi.vi2 = (m/2) ∑ vi2
在弹性碰撞中,K 和 P 都守恒。这适用于您的示例。事实上,你的球的初始速度是 (2,0) 和 (0,0),因此:
Pbefore = m * ((2,0) + (0,0)) = (2m, 0)
Kbefore = (m/2) * ((2,0).(2,0) + (0,0).(0,0)) = (m/2) * (4 + 0) = 2m
最终速度为 (1,1) 和 (1,-1),因此:
Pafter = m * ((1,1) + (1,-1)) = (2m, 0)
Kafter = (m/2) * ((1,1).(1,1) + (1,-1).(1,-1)) = (m/2) * (2 + 2) = 2m
显然 Pafter = Pbefore 和 K after = K<子>之前 。
关于c# - 二维弹性碰撞不守恒动量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21532581/
我是一名优秀的程序员,十分优秀!