00001
00002
00003
00004
00005
00006
00007
00008 #include <iostream>
00009 #include "lsm.h"
00010 int **arr;
00011 void darea(int, int);
00012
00013 int aread8(char *pfile,char *afile, double x, double y, int doall)
00014 {
00015 int i,j,err,row,col;
00016
00017 d1[1]=0; d1[2]= -1; d1[3]= -1; d1[4]= -1; d1[5]=0; d1[6]=1; d1[7]=1; d1[8]=1;
00018 d2[1]=1; d2[2]=1; d2[3]=0; d2[4]= -1; d2[5]= -1; d2[6]= -1; d2[7]=0; d2[8]=1;
00019
00020
00021 err=gridread(pfile,(void ***)&dir,RPSHRDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&ndv,&filetype);
00022 if(err != 0)goto ERROR1;
00023
00024 arr = (int **) matalloc(nx,ny,RPINTDTYPE);
00025
00026 for(i=0; i<ny; i++)
00027 {
00028 for(j=0; j<nx; j++)
00029 {
00030 if(i!=0 && i!=ny-1 && j!=0 && j!=nx-1 && dir[j][i]!= -1)
00031 arr[j][i]=0;
00032 else arr[j][i]= -1;
00033 }
00034 }
00035 if(doall == 0)
00036 {
00037 col= (int)floor((x-bndbox[0])/csize);
00038 row= (int)floor((bndbox[3]-y)/csize);
00039 if(row <0 || row > ny || col < 0 || col > nx)
00040 {
00041 printf("Given coords out of area - whole area will be calculated\n");
00042 row=0; col=0;
00043 }
00044 }
00045 else
00046 {
00047 row=0; col=0;
00048 }
00049 if(row > 0 && col > 0)
00050 {
00051
00052 darea(row,col);
00053 }
00054 else
00055 {
00056
00057
00058
00059
00060 printf("Just a flag\n");
00061 for(i=ny/2; i<ny-1; i++)
00062 { for(j=nx/2; j<nx-1; j++)
00063 darea(i,j);
00064 for(j=nx/2-1; j>=1; j--)
00065 darea(i,j);
00066 }
00067 for(i=ny/2-1; i>=1; i--)
00068 { for(j=nx/2; j<nx-1; j++)
00069 darea(i,j);
00070 for(j=nx/2-1; j>=1; j--)
00071 darea(i,j);
00072 }
00073 }
00074
00075 err=gridwrite(afile, (void **)arr,RPINTDTYPE,nx,ny,dx,dy,
00076 bndbox,csize, -1., filetype);
00077 free(arr[0]);
00078 free(arr);
00079 ERROR1:
00080 free(dir[0]);
00081 free(dir);
00082 return(err);
00083 }
00084
00085
00086 void darea(int i, int j)
00087 {
00088 int in,jn,k,con=0;
00089
00090
00091 if(arr[j][i]==0)
00092 {
00093 if(i!=0 && i!=ny-1 && j!=0 && j!=nx-1 && dir[j][i]!= -1)
00094
00095 {
00096 arr[j][i]=1;
00097 for(k=1; k<=8; k++)
00098 { in=i+d1[k];
00099 jn=j+d2[k];
00100
00101 if(dir[jn][in]>0 && (dir[jn][in]-k==4||dir[jn][in]-k==-4))
00102 {
00103 darea(in,jn);
00104 if(arr[jn][in] < 0)con = -1;
00105 else arr[j][i]=arr[j][i]+arr[jn][in];
00106 }
00107 if(dir[jn][in] < 0)con = -1;
00108 }
00109
00110
00111 }
00112 }
00113 }