Javascript 这个模拟计算引力和物体碰撞的方式有错误吗?

Javascript 这个模拟计算引力和物体碰撞的方式有错误吗?,javascript,debugging,simulation,physics,physics-engine,Javascript,Debugging,Simulation,Physics,Physics Engine,N体重力模拟乍一看似乎效果不错,对于体碰撞也是如此,但一旦引力吸引的物体开始碰撞,它们就开始疯狂地相互旋转,它们的集合作为一个整体有着非常不稳定的运动。。。代码(HTMLJavaScript)将包含在下面,为了重现我所说的内容,您可以通过单击屏幕上的随机位置来创建一个新的主体 引力的数学是在Body.prototype.gravityCalc()方法中完成的,该方法是Body对象类型(第261行)。碰撞解决方案的数学可在bodyHandle()函数的动态碰撞部分找到(第337行) //////

N体重力模拟乍一看似乎效果不错,对于体碰撞也是如此,但一旦引力吸引的物体开始碰撞,它们就开始疯狂地相互旋转,它们的集合作为一个整体有着非常不稳定的运动。。。代码(HTMLJavaScript)将包含在下面,为了重现我所说的内容,您可以通过单击屏幕上的随机位置来创建一个新的主体

引力的数学是在Body.prototype.gravityCalc()方法中完成的,该方法是Body对象类型(第261行)。碰撞解决方案的数学可在bodyHandle()函数的动态碰撞部分找到(第337行)

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//事件处理
文件。添加的文件列表器(“键控键控”,键控键控);
document.addEventListener('mousedown',mousedown)
文件.添加的文件列表器('mouseup',mouseup)
文件。添加的文件列表器('mousemove',mousemove);
文档。添加的文件列表器(“touchstart”,touchstart);
文件。添加的文件列表器('touchmove',touchmove);
文件。添加的文件列表器(“touchend”,touchend);
window.addEventListener('resize',resize);
window.onload=函数(){reset()}
mouseDown=false;
虚无=真实;
mouseX=0;
mouseY=0;
功能键控(数据){
如果(data.key==“r”){
清除间隔(循环);
重置();
}
else if(data.key='g'){
重力子=!重力子;
}
else if(data.key==“Delete”){
对于(i=0;i如果(((mouseX-bodys[i].x)**2+(mouseY-bodys[i].y)**2)我不能告诉你太多关于代码的信息。我个人认为动画可能是正确的


如果你想测试你的代码,你可以试着测试能量守恒定律和动量守恒定律是否得到遵守。例如,你可以对每个物体的动量(质量乘以速度)求和,看看当没有来自外部的力时,这个数是否保持不变(与墙壁碰撞)要做到这一点,我建议让自由空间更大。另一个量是总能量(动能加势能),这有点难,但仍然很容易计算(要计算总能量,你必须对所有对进行求和).

似乎每次月球在地表绕行星运行时,系统都会获得大量能量(如果不是因为壁的恢复系数会很快达到逃逸速度),这可能是由于欧拉积分。