【发布时间】:2014-07-14 15:58:12
【问题描述】:
所以我在 JSFiddle 中构建一个小重力模拟只是为了好玩。到目前为止,这是我的脚本:
var elements = [
{
"id": "earth",
"mass": 30,
"left": 30,
"top": 30,
"hSpeed": 300,
"vSpeed": -300
}, {
"id": "sun",
"mass": 5000,
"left": 50,
"top": 50,
"hSpeed": 0,
"vSpeed": 0
}];
var intervalTime = 10;
var intervalID;
var getDistance = function(x1, y1, x2, y2) {
// h^2 = x^2 + y^2
var xD = x1 - x2;
var yD = y1 - y2;
var hSq = xD * xD + yD * yD;
return Math.sqrt(hSq);
};
var getXPortion = function(val, x1, y1, x2, y2) {
var hD = getDistance(x1, y1, x2, y2);
var xD = x2 - x1;
if ((hD == 0) || (xD == 0) || (val == 0)) {
return 0;
}
return val / hD * xD;
};
var getYPortion = function(val, x1, y1, x2, y2) {
var hD = getDistance(x1, y1, x2, y2);
var yD = y2 - y1;
if ((hD == 0) || (yD == 0) || (val == 0)) {
return 0;
}
return val / hD * yD;
};
var animateWorld = function() {
// Calculate the change in speed for each element
// based on the gravity of all the other elements
var i = 0;
var j = 0;
var dist = 0;
var mass = 0;
var grav = 0;
var change = 0;
var chX = 0;
var chY = 0;
for (i in elements) {
for (j in elements) {
if (i != j) {
dist = getDistance(
elements[i].left,
elements[i].top,
elements[j].left,
elements[j].top
);
mass = elements[i].mass * elements[j].mass;
grav = dist == 0 ? 0 : mass / (dist * dist);
change = grav / elements[i].mass;
elements[i].hSpeed += getXPortion(
change,
elements[i].left,
elements[i].top,
elements[j].left,
elements[j].top
);
elements[i].vSpeed += getYPortion(
change,
elements[i].left,
elements[i].top,
elements[j].left,
elements[j].top
);
}
}
}
// Calculate the new position for each element
// based on the speed and move each element to it's new position
for (i in elements) {
elements[i].left += elements[i].hSpeed / 1000;
elements[i].top += elements[i].vSpeed / 1000;
$('#' + elements[i].id).css('left', elements[i].left + '%');
$('#' + elements[i].id).css('top', elements[i].top + '%');
}
};
$(document).ready(function() {
intervalID = window.setInterval(animateWorld, intervalTime);
});
我允许所有对象根据它们各自的质量和距离相互作用。问题是所有物体都在缓慢地向右漂移。由于这是一个封闭的系统,我希望只有当另一个基于质量同样向左移动时,一个才会向右移动,所以它们应该不可能随着时间的推移都向同一个方向漂移。我认为以下情况之一正在发生,但我不确定是哪一种:
- 数学中使用的浮点数会导致轻微的舍入问题(不太可能)
- 我首先计算每个物体对另一个物体的影响,然后移动它们,这一事实造成了一些偏差。我是这种情况,我该如何解决?
有什么想法吗?有没有更简单的方法来做到这一点?
【问题讨论】:
-
乍一看,好像太阳只向右飘,不向左飘,也许这有助于调试过程
-
你的地球似乎对你的太阳有相当大的影响。在开始时将地球的位置更改为右上角,并更改速度以将其向左下角发射,使其反向运行,太阳开始向另一方向移动
-
@AeroX。我不是想建立一个现实的规模,只是对重力效应的真实模拟,不管基本假设是什么
-
@neelsg 我对物理学一无所知,但只是注意到我能够通过更改起始参数使太阳向相反方向漂移。不知道它是否会给你其他地方开始调试
-
@AeroX。感谢您的建议
标签: javascript animation math simulation