Back to index

wims  3.65+svn20090927
main.c
Go to the documentation of this file.
00001 /*** MAIN.C ***/
00002 
00003 #include <stdio.h>
00004 #include <stdlib.h>  /* realloc(), qsort() */
00005 
00006 #include <strings.h>
00007 
00008 #include "vdefs.h"
00009 
00010 Site * nextone(void) ;
00011 void readsites(void) ;
00012 
00013 int sorted, triangulate, plot, debug, nsites, siteidx ;
00014 float xmin, xmax, ymin, ymax ;
00015 Site * sites ;
00016 Freelist sfl ;
00017 
00018 int
00019 main(int argc, char *argv[])
00020     {
00021     int c ;
00022     Site *(*next)() ;
00023 
00024     sorted = plot = debug = 0 ;
00025     triangulate = 0;
00026 
00027     freeinit(&sfl, sizeof(Site)) ;
00028     readsites() ;
00029     next = nextone ;
00030     siteidx = 0 ;
00031     geominit() ;
00032     if (plot)
00033         {
00034         plotinit() ;
00035         }
00036     voronoi(next) ;
00037     return (0) ;
00038     }
00039 
00040 /*** sort sites on y, then x, coord ***/
00041 
00042 int
00043 scomp(const void * vs1, const void * vs2)
00044     {
00045     Point * s1 = (Point *)vs1 ;
00046     Point * s2 = (Point *)vs2 ;
00047 
00048     if (s1->y < s2->y)
00049         {
00050         return (-1) ;
00051         }
00052     if (s1->y > s2->y)
00053         {
00054         return (1) ;
00055         }
00056     if (s1->x < s2->x)
00057         {
00058         return (-1) ;
00059         }
00060     if (s1->x > s2->x)
00061         {
00062         return (1) ;
00063         }
00064     return (0) ;
00065     }
00066 
00067 /*** return a single in-storage site ***/
00068 
00069 Site *
00070 nextone(void)
00071     {
00072     Site * s ;
00073 
00074     if (siteidx < nsites)
00075         {
00076         s = &sites[siteidx++];
00077         return (s) ;
00078         }
00079     else
00080         {
00081         return ((Site *)NULL) ;
00082         }
00083     }
00084 
00085 /*** read all sites, sort, and compute xmin, xmax, ymin, ymax ***/
00086 
00087 void
00088 readsites(void)
00089     {
00090     int i ;
00091     char *s = getenv("wims_exec_parm");
00092 
00093     if (!s || !*s) exit(0); /* nothing to do */
00094 
00095     while (isspace(*s)) s++;
00096     if (*s == '-' && s[1] == 't')
00097     {
00098       s += 2; triangulate = 1;
00099       while (isspace(*s)) s++;
00100     }
00101 
00102     nsites = 0 ;
00103     sites = (Site *) myalloc(4000 * sizeof(Site));
00104     while (sscanf(s, "%f %f", &sites[nsites].coord.x,
00105 &sites[nsites].coord.y) !=EOF)
00106         {
00107         sites[nsites].sitenbr = nsites ;
00108         sites[nsites++].refcnt = 0 ;
00109         if (nsites % 4000 == 0)
00110             sites = (Site *)
00111 realloc(sites,(nsites+4000)*sizeof(Site));
00112         s = strchr(s, '\n');
00113         if (!s++) break;
00114         }
00115 
00116     qsort((void *)sites, nsites, sizeof(Site), scomp) ;
00117     xmin = sites[0].coord.x ;
00118     xmax = sites[0].coord.x ;
00119     for (i = 1 ; i < nsites ; ++i)
00120         {
00121         if(sites[i].coord.x < xmin)
00122             {
00123             xmin = sites[i].coord.x ;
00124             }
00125         if (sites[i].coord.x > xmax)
00126             {
00127             xmax = sites[i].coord.x ;
00128             }
00129         }
00130     ymin = sites[0].coord.y ;
00131     ymax = sites[nsites-1].coord.y ;
00132     }