deltatron.c

来自「CA仿真模型中SLEUTH模型」· C语言 代码 · 共 555 行 · 第 1/2 页

C
555
字号
#define DELTATRON_MODULE#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include "igrid_obj.h"#include "landclass_obj.h"#include "globals.h"#include "random.h"#include "utilities.h"#include "ugm_macros.h"#include "memory_obj.h"#include "timer_obj.h"#include "proc_obj.h"#include "gdif_obj.h"#include "color_obj.h"#include "scenario_obj.h"#include "pgrid_obj.h"/*****************************************************************************\*********************************************************************************                                                                           ****                                 MACROS                                    ****                                                                           *********************************************************************************\*****************************************************************************/#define TRANS_PROBABILITY1(arg1,arg2)                  \    ftransition[TRANS_OFFSET(                          \       new_indices[urban_land[OFFSET((arg1),(arg2))]], \       new_indices[new_landuse])]#define TRANS_PROBABILITY2(arg1,arg2,arg3,arg4)                    \   ftransition[TRANS_OFFSET(                                       \     new_indices[phase2_land[OFFSET((arg1),(arg2))]],              \     new_indices[urban_land[OFFSET((arg3),(arg4))]])]*             \     DELTA_PHASE2_SENSITIVITY/*****************************************************************************\*********************************************************************************                                                                           ****                        STATIC FUNCTION PROTOTYPES                         ****                                                                           *********************************************************************************\*****************************************************************************/static  void delta_phase1 (int drive,                              /* IN     */                     GRID_P urban_land,                      /* IN     */                     GRID_P phase1_land,                     /* OUT    */                     GRID_P slope,                           /* IN     */                     GRID_P deltatron,                       /* IN/OUT */                     Classes * landuse_classes,              /* IN     */                     Classes * class_indices,                /* IN     */                     int *new_indices,                       /* IN     */                     CLASS_SLP_TYPE * class_slope,           /* IN     */                     FTRANS_TYPE * ftransition);           /* IN     */static  int delta_get_new_landuse (Classes * class_indices,        /* IN     */                             Classes * landuse_classes,      /* IN     */                             PIXEL local_slope,              /* IN     */                             CLASS_SLP_TYPE * class_slope); /* IN     */static  void delta_phase2 (GRID_P urban_land,                      /* IN     */                     GRID_P phase1_land,                     /* IN     */                     GRID_P deltatron,                       /* IN/OUT */                     GRID_P phase2_land,                     /* OUT    */                     Classes * landuse_classes,              /* IN     */                     int *new_indices,                       /* IN     */                     FTRANS_TYPE * ftransition);           /* IN     *//*****************************************************************************\*********************************************************************************                                                                           ****                               SCCS ID                                     ****                                                                           *********************************************************************************\*****************************************************************************/char deltatron_c_sccs_id[] = "@(#)deltatron.c	1.372	12/4/00";/*************************************************************************************************************************************************************** FUNCTION NAME: delta_deltatron** PURPOSE:       main driver which calls delta_phase1 & delta_phase2** AUTHOR:        Keith Clarke** PROGRAMMER:    Tommy E. Cathey of NESC (919)541-1500** CREATION DATE: 11/11/1999** DESCRIPTION:*****/void  delta_deltatron (int *new_indices,                         /* IN     */                   Classes * landuse_classes,                /* IN     */                   Classes * class_indices,                  /* IN     */                   GRID_P workspace1,                        /* MOD    */                   GRID_P deltatron,                         /* IN/OUT */                   GRID_P urban_land,                        /* IN     */                   GRID_P land_out,                          /* OUT    */                   GRID_P slp,                               /* IN     */                   int drive,                                /* IN     */                   CLASS_SLP_TYPE * class_slope,             /* IN     */                   FTRANS_TYPE * ftransition)              /* IN     */{  char func[] = "DeltaTron";  GRID_P phase1_land;  GRID_P phase2_land;  timer_Start (DELTA_DELTATRON);  FUNC_INIT;  assert (new_indices != NULL);  assert (landuse_classes != NULL);  assert (class_indices != NULL);  assert (workspace1 != NULL);  assert (urban_land != NULL);  assert (land_out != NULL);  assert (slp != NULL);  assert (class_slope != NULL);  assert (ftransition != NULL);  phase1_land = workspace1;  phase2_land = land_out;  delta_phase1 (drive,                                       /* IN     */                urban_land,                                  /* IN     */                phase1_land,                                 /* OUT    */                slp,                                         /* IN     */                deltatron,                                   /* IN/OUT */                landuse_classes,                             /* IN     */                class_indices,                               /* IN     */                new_indices,                                 /* IN     */                class_slope,                                 /* IN     */                ftransition                                  /* IN     */    );  delta_phase2 (urban_land,                                  /* IN     */                phase1_land,                                 /* IN     */                deltatron,                                   /* IN/OUT */                phase2_land,                                 /* OUT    */                landuse_classes,                             /* IN     */                new_indices,                                 /* IN     */                ftransition                                  /* IN     */    );  timer_Stop (DELTA_DELTATRON);  FUNC_END;}/*************************************************************************************************************************************************************** FUNCTION NAME: delta_phase1** PURPOSE:       performs deltatron phase 1 growth** AUTHOR:        Keith Clarke** PROGRAMMER:    Tommy E. Cathey of NESC (919)541-1500** CREATION DATE: 11/11/1999** DESCRIPTION:*****/static  void  delta_phase1 (int drive,                                   /* IN     */                GRID_P urban_land,                           /* IN     */                GRID_P phase1_land,                          /* OUT    */                GRID_P slope,                                /* IN     */                GRID_P deltatron,                            /* IN/OUT */                Classes * landuse_classes,                   /* IN     */                Classes * class_indices,                     /* IN     */                int *new_indices,                            /* IN     */                CLASS_SLP_TYPE * class_slope,                /* IN     */                FTRANS_TYPE * ftransition)                 /* IN     */{  char func[] = "delta_phase1";  int index;  int i;  int j;  int k;  int l;  int i_center;  int j_center;  PIXEL new_landuse;  int random_int;  timer_Start (DELTA_PHASE1);  FUNC_INIT;  assert (drive >= 0);  assert (urban_land != NULL);  assert (phase1_land != NULL);  assert (slope != NULL);  assert (deltatron != NULL);  assert (landuse_classes != NULL);  assert (class_indices != NULL);  assert (new_indices != NULL);  assert (class_slope != NULL);  assert (ftransition != NULL);  /*   *   * COPY INPUT LAND GRID INTO OUTPUT LAND GRID   *   */  util_copy_grid (urban_land, phase1_land);  /*   *   * TRY DRIVE TIMES TO MAKE TRANSITIONS   *   */  for (k = 0; k < drive; k++)  {    /*     *     * SELECT A TRANSITION PIXEL TO BE CENTER OF SPREADING CLUSTER     *     */    do    {      i_center = RANDOM_ROW;      j_center = RANDOM_COL;      index = new_indices[urban_land[OFFSET (i_center, j_center)]];    }    while (landuse_classes[index].trans == FALSE);    /*     *     * RANDOMLY CHOOSE NEW LANDUSE NUMBER     *     */    new_landuse =      delta_get_new_landuse (class_indices,                  /* IN    */                             landuse_classes,                /* IN    */                             slope[OFFSET (i_center, j_center)],   /* IN    */                             class_slope);                 /* IN    */    /*     *     * TEST TRANSITION PROBABILITY FOR NEW CLUSTER     *     */    if (RANDOM_FLOAT < TRANS_PROBABILITY1 (i_center, j_center))    {      /*       *       * TRANSITION THE CENTER PIXEL       *       */      phase1_land[OFFSET (i_center, j_center)] = new_landuse;      deltatron[OFFSET (i_center, j_center)] = 1;      /*       *       * TRY BUILDING UP CLUSTER AROUND THIS CENTER PIXEL       *       */      i = i_center;      j = j_center;      for (l = 0; l < REGION_SIZE; l++)      {        /*         *         * OCCASIONALLY RESET TO CENTER OF CLUSTER         *         */        random_int = RANDOM_INT (8);        if (random_int == 7)        {          i = i_center;          j = j_center;        }        /*         *         * GET A NEIGHBOR         *         */        util_get_neighbor (i, j, &i, &j);        if (IMAGE_PT (i, j))

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?