我想在Processing中为弹簧上的N个球系统设置动画。系统在N = 3时看起来像这样:
球的运动可用以下系统微分方程描述:
其中m是球的质量,k是弹簧的“强度”,u_n是第n个球从其平衡位移。并且还有第0和第N + 1球,其中u_0 = 0且u_(N + 1)= 0。
我认为这是我的代码中最重要的部分:
tempu = u;
tempv = v;
for(int i = 1; i <= N; i++){
a[i] = (k/m)*(u[i-1]+u[i+1]-2*u[i]);
tempv[i] += a[i];
tempv[i] += a[i];
tempu[i] += tempv[i];
tempu[i] += tempv[i];
}
u = tempu;
v = tempv;
for(int i = 1; i <= N; i++) {
ellipse(original[i] + u[i], d, 10, 10);
}
首先,我在开头填写u,v和a为0,然后修改1 u让系统移动。 (这一切都发生在设置中)。它在N = 1时工作得很好,但是对于更高的N,它会超出控制范围并且非常快地移出屏幕。我用低fps检查N = 2情况,并且2个球没有对称移动。
问题:为什么效果不好?
答案 0 :(得分:1)
您似乎希望tempu
和tempv
保留原始u
和v
数组的副本。但是,仅使用tempu = u;
为数组分配不同的变量不会复制数组;由于数组是对象,因此该赋值仅在tempu
中对同一数组进行另一个引用。
要复制数组,请使用:
tempu = u.clone();
tempv = v.clone();