我想模拟粒子的快速运动,这些粒子比它们通过的帧间间距小两倍以上。考虑下面的情况,3个相同半径的粒子以相同的速度移动到一个中心的一点。使用如下代码
for(i..)
for (j..)
check_if_ith_collides_with_jth();`在最简单的实现中,系统的行为可能如下所示:

但当3个(或更多)粒子同时碰撞时,irl应该发生的是一个特定的反弹情况:

我想要一个任意数量的粒子的解决方案。这通常是如何解决的?我可以用4个粒子展示更复杂的情况:

有可能在一个固定的,更大的框架内覆盖吗?
发布于 2019-01-12 06:00:19
定义“时间”。从您的角度来看,我可能误解了其中的一些内容,并且不确定“帧大小”是否与此有关。我以前实现过基于物理的多粒子碰撞跟踪模拟,并遇到过这种类型的问题。首先,您需要问问自己,获取所有同时发生的冲突是否对此特定应用程序有利。
在我的回答中,我假设这是一种离散时间事件驱动的sim,其中粒子沿着其轨迹前进,并对所有对应用碰撞测试。CPA =最近的接近点。
一种观点可能是,在检测时间上存在一些最小误差条,并且您可能会发现相对于该误差条“同时发生冲突”的大量对。因此,在任何步骤中,当您测试它们时,您可以选择所有CPA距离在阈值内且预计CPA时间在current_time +/- error内的对。这将捕获所有符合您的条件的对。这是可调整的,对于相同的初始条件,不同的CPA时间和距离阈值将产生不同数量的配对。
第二种观点是,由于错误,这一级别的信息对于跟踪这一点是无用的,你可以只取遇到的第一对已经碰撞的拳头对,继续sim并在下一次传递时抓住其他对。如果没有一些检查和平衡,您可能会错过一些会“通过”彼此,但这可以通过调整步长和实现一些逻辑来检查结果来修复。
如果你要通过第二个建议来实现事情,那么建立一个对称的测试用例必然会“失败”,无法重现理论结果,但它也不是一个有意义的测试。
同样类型的推理适用于三个或更多粒子在同一地点同时碰撞。除非您设置了对称测试用例,否则这种情况不太可能发生,并且如果您的模拟应用于实际情况中的某些情况,“噪声”将使您不必关心该级别的精度。实现第一个建议可能会得到您提供的特殊情况,但也可能预测多粒子碰撞,但它并不是真正发生的。
CPA通常应用于具有恒定加速速度的直线运动,但类似的概念也可以应用于更复杂的情况,特别是如果步长较小,您可以假设在时间步长内有一个粗略的CPA,或者只是根据阈值检查两个对之间的距离。
https://stackoverflow.com/questions/54079641
复制相似问题