00001 #include <stdio.h>
00002 #include "lsm.h"
00003 #include "./../pihmLIBS/shapefil.h"
00004
00005 void findIJCat(short **fdr, int i, int j, int *mIJ);
00006 int catchmentGrid(char *segFile, char *fdrFile, char *catFile);
00007 int trace(float **seg, short int **fdr, float **cat, int i, int j);
00008
00009 int catchmentGrid(char *segFile, char *fdrFile, char *catFile){
00010 int i, j;
00011 int mIJ[2];
00012 int err;
00013
00014 err=gridread(fdrFile,(void ***)&dir,RPSHRDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00015 err=gridread(segFile,(void ***)&elev,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00016 err=gridread(segFile,(void ***)&slope,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00017
00018
00019
00020 for(i=0; i<nx; i++){
00021 for(j=0; j<ny; j++){
00022 if(slope[i][j]<0)
00023 slope[i][j]=0;
00024 }
00025 }
00026
00027
00028
00029 for(i=0; i<nx; i++){
00030 for(j=0; j<ny; j++){
00031
00032 if(slope[i][j] == 0 && dir[i][j]!=-1){
00033
00034 findIJCat(dir, i, j, mIJ);
00035 slope[i][j]=trace(elev, dir, slope, mIJ[0], mIJ[1]);
00036 }
00037 }
00038 }
00039
00040
00041 err = gridwrite(catFile,(void **)slope,RPFLTDTYPE,nx,ny,dx,dy,bndbox,csize,mval,filetype);
00042
00043 }
00044
00045 int trace(float **seg, short int **fdr, float **cat, int i, int j){
00046 int mIJ[2];
00047
00048
00049 if(seg[i][j]>0){
00050
00051 return seg[i][j];
00052 }
00053 else if(cat[i][j] != 0){
00054
00055 return cat[i][j];
00056 }
00057 else if(fdr[i][j] == -1){
00058 return fdr[i][j];
00059 }
00060 else{
00061
00062
00063 findIJCat(fdr, i, j, mIJ);
00064 cat[i][j]=trace(seg, fdr, cat, mIJ[0], mIJ[1]);
00065 }
00066 return cat[i][j];
00067 }
00068
00069 void findIJCat(short **fdr, int i, int j, int *mIJ){
00070
00071
00072 if(fdr[i][j]==4 || fdr[i][j]==5 || fdr[i][j]==6)
00073 mIJ[0]=i-1;
00074 else if(fdr[i][j]==2 || fdr[i][j]==1 || fdr[i][j]==8)
00075 mIJ[0]=i+1;
00076 else
00077 mIJ[0]=i;
00078
00079 if(fdr[i][j]==4 || fdr[i][j]==3 || fdr[i][j]==2)
00080 mIJ[1]=j-1;
00081 else if(fdr[i][j]==6 || fdr[i][j]==7 || fdr[i][j]==8)
00082 mIJ[1]=j+1;
00083 else
00084 mIJ[1]=j;
00085
00086 return;
00087 }