00001 #include <stdio.h>
00002 #include "lsm.h"
00003
00004 #define MAX 8
00005
00006
00007 int streamSegmentation(char *rivFile, char *fdrFile, char *segFile, char *nodeFile);
00008 void streamGen(float **riv, short **fdr, int i, int j);
00009 void findIJ(short **fdr, int i, int j, int *mIJ);
00010 int findCell(float **riv, short **fdr, int i, int j, int (*cell)[2]);
00011
00012 FILE *fpNode_Seg;
00013 int numNodes_Seg=0;
00014
00015 int streamSegmentation(char *rivFile, char *fdrFile, char *segFile, char *nodeFile){
00016
00017 int err;
00018 int i, j, fdr;
00019 int mIJ[2];
00020 fpNode_Seg = fopen(nodeFile, "w");
00021 fprintf(fpNode_Seg, "\n");
00022 err=gridread(fdrFile,(void ***)&dir,RPSHRDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00023
00024 err=gridread(rivFile,(void ***)&elev,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00025
00026 err=gridread(rivFile,(void ***)&slope,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00027
00028 for(i=0; i<nx; i++){
00029 for(j=0; j<ny; j++){
00030
00031 if(elev[i][j]==1){
00032 fdr=dir[i][j];
00033
00034 findIJ(dir,i,j,mIJ);
00035
00036
00037 if(elev[mIJ[0]][mIJ[1]] != 1 ){
00038 printf("Outlet-> %d %d\n",mIJ[0], mIJ[1]);
00039
00040 numNodes_Seg++;
00041 fprintf(fpNode_Seg, "\n%d\t%d", i, j);
00042 streamGen(elev, dir, i, j);
00043 }
00044 }
00045 }
00046 }
00047 rewind(fpNode_Seg);
00048 fprintf(fpNode_Seg, "%d\n", numNodes_Seg);
00049 fclose(fpNode_Seg);
00050 err = gridwrite(segFile,(void **)slope,RPFLTDTYPE,nx,ny,dx,dy,bndbox,csize,mval,filetype);
00051 if(err != 0)return(err);
00052 }
00053
00054
00055 void streamGen(float **riv, short **fdr, int i, int j){
00056 static int num = 1;
00057 int stop = 0;
00058 int ii;
00059 int cell[MAX][2];
00060 int temp;
00061
00062
00063
00064
00065 while(stop == 0){
00066 temp=findCell(riv, fdr, i, j, cell);
00067
00068
00069 slope[i][j]=num;
00070
00071 if(temp==0){
00072 num++;
00073 return;
00074 }
00075 else if(temp==1){
00076 i=cell[0][0];
00077 j=cell[0][1];
00078 }
00079 else{
00080 stop = 1;
00081 num++;
00082
00083 if(temp>1){
00084 for(ii=0; ii<temp; ii++){
00085 numNodes_Seg++;
00086 fprintf(fpNode_Seg, "\n%d\t%d", cell[ii][0], cell[ii][1]);
00087 streamGen(riv, fdr, cell[ii][0], cell[ii][1]);
00088 }
00089 }
00090 }
00091 }
00092 return;
00093 }
00094
00095
00096 void findIJ(short **fdr, int i, int j, int *mIJ){
00097
00098
00099 if(fdr[i][j]==4 || fdr[i][j]==5 || fdr[i][j]==6)
00100 mIJ[0]=i-1;
00101 else if(fdr[i][j]==2 || fdr[i][j]==1 || fdr[i][j]==8)
00102 mIJ[0]=i+1;
00103 else
00104 mIJ[0]=i;
00105
00106 if(fdr[i][j]==4 || fdr[i][j]==3 || fdr[i][j]==2)
00107 mIJ[1]=j-1;
00108 else if(fdr[i][j]==6 || fdr[i][j]==7 || fdr[i][j]==8)
00109 mIJ[1]=j+1;
00110 else
00111 mIJ[1]=j;
00112
00113 return;
00114 }
00115
00116
00117 int findCell(float **riv, short **dir, int i, int j, int (*cell)[2]){
00118 int ii, jj;
00119 int cellCount=0;
00120 int fdr;
00121 int mIJ[2];
00122
00123 for(ii=i-1; ii<=i+1; ii++){
00124 for(jj=j-1; jj<=j+1; jj++){
00125
00126 if((ii!=i || jj!=j) && riv[ii][jj]==1){
00127
00128 findIJ(dir, ii, jj, mIJ);
00129
00130 if(mIJ[0]==i && mIJ[1]==j){
00131 cell[cellCount][0]=ii;
00132 cell[cellCount][1]=jj;
00133 cellCount++;
00134
00135
00136 }
00137 }
00138 }
00139 }
00140
00141 return cellCount;
00142 }
00143