cflw
#1
作业2
作业描述
一个万有引力就把我整不会了。别人是太阳系银河系,我是天女散花,而且越飞越远,我把万有引力公式的1/r^2
拿掉才能把物体聚在一起。最菜学员非我莫属了。
本来有几个脑洞创意的。比如每个物体有不同质量,质量越大,显示的圆越大,但是canvas.circles()
和scene.particles()
的半径只能传一个值,所以不了了之。
还有个问题,程序的初始化时间随着物体数量增加而逐渐增长,当我把物体数量设置成100时只弹出一个白色窗口,等很久(1分钟左右)也看不到运行结果。
效果展示
代码链接
Code
1 个赞
中文编程依然大受震撼:)
f = -G * v质量[i] * v质量[j] / r * diff
这行代码其实仿真的是一个各个星球用1阶弹簧模型两两相连的系统。1阶弹簧模型指弹簧弹性势能随着距离增加而线性增加的模型。
爆炸的原因可能是因为这行代码:
r = diff.norm()
潜在意义上可能会使你算力的时候发生一个divide-by-zero error。现实世界的万有引力不会爆炸的原因是因为当两个星体靠的足够近的时候(diff < r_1+r_2时),他们就撞到一起去了。我们的仿真中没有考虑星体的体积和碰撞,所以可能需要在这个r上面做一些手脚,比如强制把他clamp到某个epsilon以上。这个epsilon可以是1e-3甚至更大一些的数字。
关于越飞越远这个事情应该是过大的力产生了过大的动能,当一个星星的动能大过他被整个星系吸引的引力势能的时候,他就可以逃逸了。
5 个赞