GRASS Programmer's Manual
6.4.2(2012)
|
00001 #include <stdlib.h> 00002 #include <grass/imagery.h> 00003 00004 int I_init_signatures(struct Signature *S, int nbands) 00005 { 00006 S->nbands = nbands; 00007 S->nsigs = 0; 00008 S->sig = NULL; 00009 S->title[0] = 0; 00010 00011 return 0; 00012 } 00013 00014 #define SIG struct One_Sig 00015 00016 int I_new_signature(struct Signature *S) 00017 { 00018 int n; 00019 int i; 00020 00021 i = S->nsigs++; 00022 S->sig = (SIG *) G_realloc(S->sig, S->nsigs * sizeof(SIG)); 00023 00024 S->sig[i].mean = (double *)G_calloc(S->nbands, sizeof(double)); 00025 S->sig[i].var = (double **)G_calloc(S->nbands, sizeof(double *)); 00026 00027 for (n = 0; n < S->nbands; n++) 00028 S->sig[i].var[n] = (double *)G_calloc(S->nbands, sizeof(double)); 00029 00030 S->sig[i].status = 0; 00031 S->sig[i].have_color = 0; 00032 sprintf(S->sig[i].desc, "Class %d", i + 1);; 00033 return S->nsigs; 00034 } 00035 00036 int I_free_signatures(struct Signature *S) 00037 { 00038 int n; 00039 int i; 00040 00041 for (i = 0; i < S->nsigs; i++) { 00042 for (n = 0; n < S->nbands; n++) 00043 free(S->sig[i].var[n]); 00044 free(S->sig[i].var); 00045 free(S->sig[i].mean); 00046 } 00047 I_init_signatures(S, 0); 00048 00049 return 0; 00050 } 00051 00052 int I_read_one_signature(FILE * fd, struct Signature *S) 00053 { 00054 int n; 00055 int i; 00056 struct One_Sig *s; 00057 00058 while ((i = fgetc(fd)) != EOF) 00059 if (i == '#') 00060 break; 00061 if (i != '#') 00062 return 0; 00063 00064 i = I_new_signature(S); 00065 s = &S->sig[i - 1]; 00066 00067 I_get_to_eol(s->desc, sizeof(s->desc), fd); 00068 G_strip(s->desc); 00069 00070 if (fscanf(fd, "%d", &s->npoints) != 1) 00071 return -1; 00072 00073 for (i = 0; i < S->nbands; i++) { 00074 if (fscanf(fd, "%lf", &s->mean[i]) != 1) 00075 return -1; 00076 } 00077 00078 for (i = 0; i < S->nbands; i++) { 00079 for (n = 0; n <= i; n++) { 00080 if (fscanf(fd, "%lf", &s->var[i][n]) != 1) 00081 return -1; 00082 s->var[n][i] = s->var[i][n]; /* added 28 aug 91 */ 00083 } 00084 } 00085 if (fscanf(fd, "%f%f%f", &s->r, &s->g, &s->b) == 3 && 00086 s->r >= 0.0 && s->r <= 1.0 && 00087 s->g >= 0.0 && s->g <= 1.0 && s->b >= 0.0 && s->b <= 1.0) 00088 s->have_color = 1; 00089 00090 s->status = 1; 00091 return 1; 00092 } 00093 00094 int I_read_signatures(FILE * fd, struct Signature *S) 00095 { 00096 int n; 00097 00098 S->title[0] = 0; 00099 while ((n = fgetc(fd)) != EOF) 00100 if (n == '#') 00101 break; 00102 if (n != '#') 00103 return -1; 00104 I_get_to_eol(S->title, sizeof(S->title), fd); 00105 G_strip(S->title); 00106 00107 while ((n = I_read_one_signature(fd, S)) == 1) ; 00108 00109 if (n < 0) 00110 return -1; 00111 if (S->nsigs == 0) 00112 return -1; 00113 return 1; 00114 } 00115 00116 int I_write_signatures(FILE * fd, struct Signature *S) 00117 { 00118 int k; 00119 int n; 00120 int i; 00121 struct One_Sig *s; 00122 00123 fprintf(fd, "#%s\n", S->title); 00124 for (k = 0; k < S->nsigs; k++) { 00125 s = &S->sig[k]; 00126 if (s->status != 1) 00127 continue; 00128 fprintf(fd, "#%s\n", s->desc); 00129 fprintf(fd, "%d\n", s->npoints); 00130 for (i = 0; i < S->nbands; i++) 00131 fprintf(fd, "%g ", s->mean[i]); 00132 fprintf(fd, "\n"); 00133 for (i = 0; i < S->nbands; i++) { 00134 for (n = 0; n <= i; n++) 00135 fprintf(fd, "%g ", s->var[i][n]); 00136 fprintf(fd, "\n"); 00137 } 00138 if (s->have_color) 00139 fprintf(fd, "%g %g %g\n", s->r, s->g, s->b); 00140 } 00141 return 1; 00142 }