Java 此模拟中的空气阻力导致速度急剧上升

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,

我遇到的问题是,我试图在这个基本物理模拟(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, 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=位置,我觉得我没有解释过,谢谢!这个网站还展示了速度积分与加速度的关系