gpt4 book ai didi

c# - 2D 弹性碰撞不守恒动量

转载 作者:行者123 更新时间:2023-12-02 21:35:22 25 4
gpt4 key购买 nike

我有一个小型物理程序,其中有大量大小和质量相同的球,它们在 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 个球的系统中,当我从动量为 10 的 1 个球开始时(弹性墙,无摩擦),系统的总动量会攀升至约 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

显然P之后 = P之前和K 之后 = K<子>之前。

关于c# - 2D 弹性碰撞不守恒动量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21532581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com