GRASS Programmer's Manual  6.4.2(2012)
sig.c
Go to the documentation of this file.
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 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines