空气和流体阻力

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

2.8 空气和流体阻力

  


图2-4

1、流体阻力

  • 物体通过流体或者气体时同样会受摩擦力的作用,这种摩擦力有很多名字,如粘滞
    力、阻力和流体阻力。
  • 流体阻力产生的效果和前面的摩擦力相同(物体会减速),但是计算阻力的方式却有些不同。

2、阻力公式

  • 代表阻力
    我们的最终目的就是计算这个阻力向量,将它传入applyForce()函数

  • -1/2是一个常量:
    -0.5.对我们来说,这个数值并没有多少意义,因为这只是一个随意编造的常量.但有一点很重要,该常量必须是一个负数,这代表阻力的方向和速度的方向相反(和摩擦力类似)

  • ρ是希腊字母rho,它代表流体的密度,
    在这里我们并不需要关心它.为了简化问题,我们假设流体的密度是1.

  • v代表物体的移动速率.
    前面我们已经接触过它了,速率等于速度向量的大小:
    velocity.magnitude(),
    指v的平方或者v*v

  • A代表物体前端推动流体(或气体)流动部分的面积.
    举个例子,根据空气动力学设计的兰博基尼跑车所受的空气阻力肯定比四四方方的沃尔沃汽车小.
    为了方便模拟,我们假定物体都是球形的,因此,这个变量也将被我们忽略

  • 是阻力系数,
    它和摩擦系数ρ类似,是一个常量.我们可以根据阻力的强弱确定它的大小

  • 看起来是否很熟悉?
    它代表速度的单位向量,也就是velocity.normalize().
    和摩擦力一样,阻力的方向也和物体的运动方向相反

3、简化公式

我们决定只保留其中一些有用的元素,最后得到简化版的阻力公式:

图2-5 简化版的阻力公式

float c = 0.1;    // 阻力系数
float speed = v.mag();    // 速度
float dragMagnitude = c * speed * speed;    // 公式的第一部分(大小)
PVector drag = velocity.get();
drag.mult(-1);    // 公式的第二部分(方向)
drag.normalize();

drag.mult(dragMagnitude);    // 合并大小和方向

4、流体对象

  • 加入一个新的东西——流体,Mover对象会穿过流体组成的区域。
  • 流体对象是一块矩形区域,有自己的位置、宽度、高度和“阻力系数”,
    比如物体能轻易穿过空气,但难以穿过粘稠的液体,因为前者的阻力系数更小。
  • 除此之外,它还应该有个在屏幕上绘制自身的方法
class Liquid {
float x,y,w,h; 流体对象包含一个阻力系数变量
float c;
Liquid(float x_, float y_, float w_, float h_, float c_) {
    x = x_;
    y = y_;
    w = w_;
    h = h_;
    c = c_;
  }
void display() {
    noStroke();
    fill(175);
    rect(x,y,w,h);
  }
}
  • 在主程序中加入一个流体对象的变量声明,并在setup()函数中对它进行初始化。
Liquid liquid; 初始化流体对象,它的阻力系数很低,等于0.1,否则对象穿过流体时会很快停止运动
void setup() {
    liquid = new Liquid(0, height/2, width, height/2, 0.1);
}

你可能感兴趣的:(空气和流体阻力)