基于Processing绘制的森林火灾模型

1.森林火灾模型的2-D元胞自动机的构建,同样模型也可适用于其他模型,比如传染病的传播等。

2.规则:

(1)在一个空场地(灰色),一棵树以pGrowth的机率成长。

(2)如果其相邻树中有至少有一棵树正在燃烧,那么这颗树也会成为一棵燃烧树(红色)。

(3)一棵燃烧树(红色)成为一个空场地(灰色)。

(4)如果周围没有任何燃烧树,那么这个树成为燃烧树的可能性为pBurn。比如由雷击导致的燃烧,就是其中的一种可能。

3.项目实现:

int[][][] pix = new int[2][400][400];

int toDraw = 0;

int tree = 0;

int burningTree = 1;

int emptySite = 2;

int x_limit = 400;

int y_limit = 400;

color brown = color(80, 50, 10); // brown

color red   = color(255, 0, 0); // red;

color green = color(0, 255, 0); // green

float pGrowth = 0.01;

float pBurn = 0.00006;

boolean prob( float p )

{

  if (random(0, 1) < p) return true;

  else return false;

}

void setup()



{

  size(400, 400);

  frameRate(60); 

  /* Initialize to all empty sites */

  for (int x = 0 ; x < x_limit ; x++) {

    for (int y = 0 ; y < y_limit ; y++) {

      pix[toDraw][x][y] = emptySite;

    }

  } 

}

void draw()

{

  update(); 

  for (int x = 0 ; x < x_limit ; x++) {

    for (int y = 0 ; y < y_limit ; y++) {

      if        (pix[toDraw][x][y] == tree) {

        stroke( green );



} else if (pix[toDraw][x][y] == burningTree) {

        stroke( red );

      } else stroke( brown );

      point( x, y );

    }

  }

  toDraw = (toDraw == 0) ? 1 : 0;

}

void update()

{

  int x, y, dx, dy, cell, chg, burningTreeCount;

  int toCompute = (toDraw == 0) ? 1 : 0;

  for (x = 1 ; x < x_limit-1 ; x++) {

    for (y = 1 ; y < y_limit-1 ; y++) {

      cell = pix[toDraw][x][y];

      // Survey area for burning trees

      burningTreeCount = 0;

      for (dx = -1 ; dx < 2 ; dx++) {

        for (dy = -1 ; dy < 2 ; dy++) {

          if ((dx == 0) && (dy == 0)) continue;

          else if (pix[toDraw][x+dx][y+dy] == burningTree) burningTreeCount++;



     }

      }

      // Determine next state

      if      (cell == burningTree) chg = emptySite;

      else if ((cell == emptySite) && (prob(pGrowth))) chg = tree;

      else if ((cell == tree) && (prob(pBurn))) chg = burningTree;

      else if ((cell == tree) && (burningTreeCount > 0)) chg = burningTree;

      else chg = cell;

      pix[toCompute][x][y] = chg;

    }

  }

}

4.模型展示:

发布了26 篇原创文章 · 获赞 35 · 访问量 739

猜你喜欢

转载自blog.csdn.net/csdnliu123/article/details/105520428