Java 此模拟中的空气阻力导致速度急剧上升
我遇到的问题是,我试图在这个基本物理模拟(Java[Processing])中向一个对象添加阻力,但一旦我添加了适当的公式,它就会导致对象的速度在相反的方向急剧增加。当然,问题是出于某种原因,阻力被计算得太高了,但我不确定为什么会发生这种情况,因为我使用的是真实世界的方程式Java 此模拟中的空气阻力导致速度急剧上升,java,processing,simulation,physics,Java,Processing,Simulation,Physics,我遇到的问题是,我试图在这个基本物理模拟(Java[Processing])中向一个对象添加阻力,但一旦我添加了适当的公式,它就会导致对象的速度在相反的方向急剧增加。当然,问题是出于某种原因,阻力被计算得太高了,但我不确定为什么会发生这种情况,因为我使用的是真实世界的方程式 void setup(){size(1280,720);} class Circle{ float x,y,r,m,dx,dy,ax,ay,fx,fy; Circle(float xPos, float yPos,
void setup(){size(1280,720);}
class Circle{
float x,y,r,m,dx,dy,ax,ay,fx,fy;
Circle(float xPos, float yPos, float Radius, float Mass){
x = xPos;
y = yPos;
r = Radius;
m = Mass;
}
void ADD_DRAG(){
fx -= 0.5 * 1.225 * dx * dx * 0.5 * r * PI;
fy -= 0.5 * 1.225 * dy * dy * 0.5 * r * PI;
}
void update(){
ADD_DRAG();
ax = fx / m;
ay = fy / m;
dx += ax / frameRate;
dy += ay / frameRate;
x += dx / frameRate;
y += dy / frameRate;
}
}
Circle[] SceneObjects = {new Circle(50,50,20,20000),new Circle(50,50,2,20)};
void draw(){
background(51);
for (Circle c : SceneObjects){
c.update();
circle(c.x * 3,c.y * 3,c.r * 3);
}
}
void mouseClicked(){
if(SceneObjects[1].fx != 2000)
SceneObjects[1].fx = 2000;
else
SceneObjects[1].fx = 0;
}
这是代码,本质上是一个Circle类,它存储对象属性,然后在每个绘制循环中更新应用的力。鼠标单击的空隙仅用于通过向对象添加力进行测试。非常感谢您的帮助,谢谢
我正在使用的数学:
对于ax=fx/m,重新排列的F=ma代码>
加速度*时间=速度dx+=ax/帧速率代码>(帧速率为1/次)
距离=速度*时间=对于x+=dx/帧速率代码>(同上)
对于阻力,我使用这个方程,加上常数,如空气密度等。这里有两个错误
你没有给我们数字(或a),但向量代数是关闭的
是的,加速度是f=-kv2和v|2=vx2+vy2,但这并不意味着可以将f分解为fx=kvx2和fy=kvy2。不仅你的震级变了,而且你的加速度现在(通常)与运动不一致;投射物的路径将趋向于向轴之间的对角线弯曲(例如x=y)
此外,代码总是在负x和负y方向上提供加速度。如果你的射弹恰好开始朝那个方向发射,你的空气阻力版本会加速它
最后,您的时间间隔可能太长
有更好的办法。微分方程为v'=-kv|v|,精确解为v=(1/kt)z(适当选择起始时间),其中z为单位方向向量。(我不知道如何在字母上加上插入符号。)这导致v(t)=(1/t)v(t=1.0)
所以你可以算出一个虚构的时间t0,然后用1/(kt)计算每个新的速度,或者你可以根据之前的速度计算新的速度:vn+1=vn/(kd-vn+1),其中d是时间间隔。(当然,你必须正确地将v分解为vx和vy。)
如果你不熟悉向量代数,这可能会让人困惑,但如果不学习基础知识,你就无法让空气阻力sim卡工作。我不是专家,但你应该积分梯度吗?我想,因为dx和dy是速度,因为m/s除以帧速率会得到米,因为帧速率是1/s。积分不是做同样事情的另一种方式吗?我不这么认为。如果你想要网络x和y,你当然可以积分x(+=),但是积分dx和dy至少对我来说没有意义。你能用你正在使用的数学链接编辑这篇文章吗?我已经添加了数学。另外,如果fx=力ax=加速度dx=速度x=位置,我觉得我没有解释过,谢谢!这个网站还展示了速度积分与加速度的关系