--- ray/src/util/glarendx.c 2003/11/19 16:21:28 2.9 +++ ray/src/util/glarendx.c 2004/01/02 12:48:36 2.10 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: glarendx.c,v 2.9 2003/11/19 16:21:28 greg Exp $"; +static const char RCSid[] = "$Id: glarendx.c,v 2.10 2004/01/02 12:48:36 schorsch Exp $"; #endif /* * Compute Glare Index given by program name or -t option: @@ -18,21 +18,48 @@ static const char RCSid[] = "$Id: glarendx.c,v 2.9 200 * 12 April 1991 Greg Ward EPFL * 19 April 1993 R. Compagnon EPFL (added dgi, brs_gi, ugr) */ - + #include #include "standard.h" #include "view.h" - - -double posindex(); - -double direct(), guth_dgr(), guth_vcp(), cie_cgi(), - indirect(), total(), dgi(), brs_gi(), ugr(); - + + +struct glare_src { + FVECT dir; /* source direction */ + double dom; /* solid angle */ + double lum; /* average luminance */ + struct glare_src *next; +} *all_srcs = NULL; + +struct glare_dir { + double ang; /* angle (in radians) */ + double indirect; /* indirect illuminance */ + struct glare_dir *next; +} *all_dirs = NULL; + +typedef double gdfun(struct glare_dir *gd); + +static gdfun dgi; +static gdfun brs_gi; +static gdfun ugr; +static gdfun guth_dgr; +static gdfun guth_vcp; +static gdfun cie_cgi; +static gdfun direct; +static gdfun indirect; +static gdfun total; + +static gethfunc headline; +static void init(void); +static void read_input(void); +static void print_values(gdfun *func); +static double posindex(FVECT sd, FVECT vd, FVECT vu); + + struct named_func { char *name; - double (*func)(); + gdfun *func; char *descrip; } all_funcs[] = { {"dgi", dgi, "Daylight Glare Index"}, @@ -46,33 +73,22 @@ struct named_func { {"vert_ind", indirect, "Indirect Vertical Illuminance"}, {NULL} }; - -struct glare_src { - FVECT dir; /* source direction */ - double dom; /* solid angle */ - double lum; /* average luminance */ - struct glare_src *next; -} *all_srcs = NULL; - -struct glare_dir { - double ang; /* angle (in radians) */ - double indirect; /* indirect illuminance */ - struct glare_dir *next; -} *all_dirs = NULL; - + #define newp(type) (type *)malloc(sizeof(type)) - + char *progname; int print_header = 1; - + VIEW midview = STDVIEW; - + int wrongformat = 0; - - -main(argc, argv) -int argc; -char *argv[]; + + +int +main( + int argc, + char *argv[] +) { struct named_func *funp; char *progtail; @@ -123,14 +139,16 @@ userr: fprintf(stderr, "\t%12s\t%s\n", funp->name, funp->descrip); exit(1); } - - -int -headline(s) /* get line from header */ -char *s; + + +static int +headline( /* get line from header */ + char *s, + void *p +) { char fmt[32]; - + if (print_header) /* copy to output */ fputs(s, stdout); if (isview(s)) @@ -141,9 +159,10 @@ char *s; } return(0); } - - -init() /* initialize calculation */ + + +static void +init(void) /* initialize calculation */ { /* read header */ getheader(stdin, headline, NULL); @@ -158,9 +177,10 @@ init() /* initialize calculation */ exit(1); } } - - -read_input() /* read glare sources from stdin */ + + +static void +read_input(void) /* read glare sources from stdin */ { #define S_SEARCH 0 #define S_SOURCE 1 @@ -169,7 +189,7 @@ read_input() /* read glare sources from stdin */ char buf[128]; register struct glare_src *gs; register struct glare_dir *gd; - + while (fgets(buf, sizeof(buf), stdin) != NULL) switch (state) { case S_SEARCH: @@ -219,26 +239,29 @@ readerr: #undef S_SOURCE #undef S_DIREC } - - -print_values(funp) /* print out calculations */ -double (*funp)(); + + +static void +print_values( /* print out calculations */ + gdfun *func +) { register struct glare_dir *gd; - + for (gd = all_dirs; gd != NULL; gd = gd->next) - printf("%f\t%f\n", gd->ang*(180.0/PI), (*funp)(gd)); + printf("%f\t%f\n", gd->ang*(180.0/PI), (*func)(gd)); } - - -double -direct(gd) /* compute direct vertical illuminance */ -struct glare_dir *gd; + + +static double +direct( /* compute direct vertical illuminance */ + struct glare_dir *gd +) { FVECT mydir; double d, dval; register struct glare_src *gs; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); dval = 0.0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -248,24 +271,26 @@ struct glare_dir *gd; } return(dval); } - - -double -indirect(gd) /* return indirect vertical illuminance */ -struct glare_dir *gd; + + +static double +indirect( /* return indirect vertical illuminance */ + struct glare_dir *gd +) { return(gd->indirect); } - - -double -total(gd) /* return total vertical illuminance */ -struct glare_dir *gd; + + +static double +total( /* return total vertical illuminance */ + struct glare_dir *gd +) { return(direct(gd)+gd->indirect); } - - + + /* * posindex - compute glare position index from: * @@ -279,14 +304,17 @@ struct glare_dir *gd; * This calculation presumes the view direction and up vectors perpendicular. * We return a value less than zero for improper positions. */ - -double -posindex(sd, vd, vu) /* compute position index */ -FVECT sd, vd, vu; + +static double +posindex( /* compute position index */ + FVECT sd, + FVECT vd, + FVECT vu +) { double sigma, tau; double d; - + d = DOT(sd,vd); if (d <= 0.0) return(-1.0); @@ -302,17 +330,18 @@ FVECT sd, vd, vu; + sigma*(21. + tau*(.26667 + tau*-.002963))*1e-5 ) ) ); } - - -double -dgi(gd) /* compute Daylight Glare Index */ -struct glare_dir *gd; + + +static double +dgi( /* compute Daylight Glare Index */ + struct glare_dir *gd +) { register struct glare_src *gs; FVECT mydir,testdir[7],vhor; double r,posn,omega,p[7],sum; int i,n; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = 0.0; n = 0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -344,7 +373,7 @@ struct glare_dir *gd; omega += (2*PI-r*PI*(1+1/r/r))*(-p[0]-0.1667*(p[1]+p[3]) +0.3334*(p[2]+p[4]+p[5]+p[6])); - sum += pow(gs->lum,1.6) * pow(omega,0.8) / + sum += pow(gs->lum,1.6) * pow(omega,0.8) / (gd->indirect/PI + 0.07*sqrt(gs->dom)*gs->lum); n++; } @@ -352,17 +381,18 @@ struct glare_dir *gd; return(0.0); return( 10*log10(0.478*sum) ); } - -double -brs_gi(gd) /* compute BRS Glare Index */ -struct glare_dir *gd; + +static double +brs_gi( /* compute BRS Glare Index */ + struct glare_dir *gd +) { register struct glare_src *gs; FVECT mydir; double p; double sum; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = 0.0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -378,9 +408,10 @@ struct glare_dir *gd; } -double -guth_dgr(gd) /* compute Guth discomfort glare rating */ -struct glare_dir *gd; +static double +guth_dgr( /* compute Guth discomfort glare rating */ + struct glare_dir *gd +) { #define q(w) (20.4*w+1.52*pow(w,.2)-.075) register struct glare_src *gs; @@ -389,7 +420,7 @@ struct glare_dir *gd; double sum; double wtot, brsum; int n; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = wtot = brsum = 0.0; n = 0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -407,39 +438,41 @@ struct glare_dir *gd; pow((double)n, -.0914) ) ); #undef q } - - + + #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 #endif - + #define norm_integral(z) (1.-.5*erfc((z)/M_SQRT2)) - - -double -guth_vcp(gd) /* compute Guth visual comfort probability */ -struct glare_dir *gd; + + +static double +guth_vcp( /* compute Guth visual comfort probability */ + struct glare_dir *gd +) { extern double erfc(); double dgr; - + dgr = guth_dgr(gd); if (dgr <= FTINY) return(100.0); return(100.*norm_integral(6.374-1.3227*log(dgr))); } - - -double -cie_cgi(gd) /* compute CIE Glare Index */ -struct glare_dir *gd; + + +static double +cie_cgi( /* compute CIE Glare Index */ + struct glare_dir *gd +) { register struct glare_src *gs; FVECT mydir; double dillum; double p; double sum; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = 0.0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -455,15 +488,16 @@ struct glare_dir *gd; } -double -ugr(gd) /* compute Unified Glare Rating */ -struct glare_dir *gd; +static double +ugr( /* compute Unified Glare Rating */ + struct glare_dir *gd +) { register struct glare_src *gs; FVECT mydir; double p; double sum; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = 0.0; for (gs = all_srcs; gs != NULL; gs = gs->next) {