我用 Java 编写了一个程序,圆圈可以相互反弹并相互吸引。
在大多数情况下(屏幕上的几个圆圈),没有明显的错误。当屏幕上有大量圆圈时,问题开始发生。有时,如果太拥挤,圆圈会重叠。就好像所有其他圆圈的重量正在将圆圈压在一起,导致它们重叠。当然,那里的程序不知道一个圆圈的重量,所以它并没有真正粉碎。最有可能的是,处理解决冲突的逻辑无法处理拥挤的情况。
圆圈存储在一个数组中,每个圆圈都使用 for 循环遍历数组,将自己与其他圆圈进行比较。如果这个圆的中心和另一个圆的中心之间的距离小于它们的半径之和,那么这些圆正在碰撞。使用碰撞方程更新两个圆的速度。
我认为问题的出现是因为如果一个圆圈被包围,它可能会在它后面的圆圈中接收到更新的速度,而它后面的圆圈也会在前一个圆圈中接收到更新的速度。换句话说,两个圆圈被告知要相互靠近,即使它们已经接触。一旦它们以这种方式重叠,我不知道他们为什么不撤消重叠。
如果它们重叠,我已经尝试通过找到它们重叠的距离来恢复触摸场景,然后将它们彼此分开;每个都将重叠距离的一半分开。这不会改变圆的速度,只会改变它们的位置。
这仍然不能解决问题。如果圆圈被包围,并且它与其中一个相邻的圆圈重叠,则它的位置会更改,因此它们不会重叠,但这个新位置可能会导致它与另一个圆圈重叠。同样的问题。
如果没有重力将这些圆圈推到一起,它们最终会散开并解决它们重叠的问题,但重力阻止了这种情况的发生。
更多信息:
在计算碰撞后的新速度时不考虑重力。