ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/glarendx.c
(Generate patch)

Comparing ray/src/util/glarendx.c (file contents):
Revision 1.1 by greg, Tue Apr 16 16:40:22 1991 UTC vs.
Revision 1.5 by greg, Mon Apr 22 10:07:36 1991 UTC

# Line 7 | Line 7 | static char SCCSid[] = "$SunId$ LBL";
7   /*
8   * Compute Glare Index given by program name:
9   *
10 < *      gnuth_dgr -     Gnuth discomfort glare rating
11 < *      gnuth_vcp -     Gnuth visual comfort probability
10 > *      guth_dgr -      Guth discomfort glare rating
11 > *      guth_vcp -      Guth visual comfort probability
12   *
13   *              12 April 1991   Greg Ward       EPFL
14   */
# Line 21 | Line 21 | extern double  erfc();
21   double  posindex();
22   int     headline();
23  
24 < double  direct(), gnuth_dgr(), gnuth_vcp();
24 > double  direct(), guth_dgr(), guth_vcp();
25  
26   struct named_func {
27          char    *name;
28          double  (*func)();
29   } all_funcs[] = {
30          {"direct", direct},
31 <        {"gnuth_dgr", gnuth_dgr},
32 <        {"gnuth_vcp", gnuth_vcp},
31 >        {"guth_dgr", guth_dgr},
32 >        {"guth_vcp", guth_vcp},
33          {NULL}
34   };
35  
# Line 53 | Line 53 | int    print_header = 1;
53  
54   VIEW    midview = STDVIEW;
55  
56 + int     wrongformat = 0;
57  
58 +
59   main(argc, argv)
60   int     argc;
61   char    *argv[];
# Line 89 | Line 91 | char   *argv[];
91                          exit(1);
92                  }
93                                          /* read header */
94 <        getheader(stdin, headline);
94 >        getheader(stdin, headline, NULL);
95 >        if (wrongformat) {
96 >                fprintf(stderr, "%s: bad input format\n", progname);
97 >                exit(1);
98 >        }
99          if (print_header) {             /* add to header */
100                  printargs(i, argv, stdout);
101                  putchar('\n');
102          }
103                                          /* set view */
104          if (setview(&midview) != NULL) {
105 <                fprintf(stderr, "%s: bad view information in input\n");
105 >                fprintf(stderr, "%s: bad view information in input\n",
106 >                                progname);
107                  exit(1);
108          }
109                                          /* get findglare data */
# Line 119 | Line 126 | userr:
126   headline(s)                     /* get line from header */
127   char    *s;
128   {
129 +        char    fmt[32];
130 +
131          if (print_header)               /* copy to output */
132                  fputs(s, stdout);
133          if (!strncmp(s, VIEWSTR, VIEWSTRL))
134                  sscanview(&midview, s+VIEWSTRL);
135 +        else if (isformat(s)) {
136 +                formatval(fmt, s);
137 +                wrongformat = strcmp(fmt, "ASCII");
138 +        }
139   }
140  
141  
# Line 155 | Line 168 | read_input()                   /* read glare sources from stdin */
168                                          &gs->dir[0], &gs->dir[1], &gs->dir[2],
169                                          &gs->dom, &gs->lum) != 5)
170                                  goto readerr;
171 +                        normalize(gs->dir);
172                          gs->next = all_srcs;
173                          all_srcs = gs;
174                          break;
# Line 225 | Line 239 | struct glare_dir       *gd;
239   * All vectors are assumed to be normalized.
240   * This function is an implementation of the method proposed by
241   * Robert Levin in his 1975 JIES article.
242 + * This calculation presumes the view direction and up vectors perpendicular.
243   * We return a value less than zero for improper positions.
244   */
245  
# Line 238 | Line 253 | FVECT  sd, vd, vu;
253          d = DOT(sd,vd);
254          if (d <= 0.0)
255                  return(-1.0);
256 +        if (d >= 1.0)
257 +                return(1.0);
258          sigma = acos(d) * (180./PI);
259 <        tau = acos(DOT(sd,vu)/sqrt(1.0-d*d)) * (180./PI);
259 >        d = DOT(sd,vu)/sqrt(1.0-d*d);
260 >        if (d >= 1.0)
261 >                tau = 0.0;
262 >        else
263 >                tau = acos(d) * (180./PI);
264          return( exp( sigma*( (35.2 - tau*.31889 - 1.22*exp(-.22222*tau))*1e-3
265                          + sigma*(21. + tau*(.26667 + tau*-.002963))*1e-5 )
266                  ) );
# Line 247 | Line 268 | FVECT  sd, vd, vu;
268  
269  
270   double
271 < gnuth_dgr(gd)           /* compute Gnuth discomfort glare rating */
271 > guth_dgr(gd)            /* compute Guth discomfort glare rating */
272   struct glare_dir        *gd;
273   {
274   #define q(w)    (20.4*w+1.52*pow(w,.2)-.075)
275          register struct glare_src       *gs;
276          double  p;
277          double  sum;
278 +        double  wtot, brsum;
279          int     n;
280  
281 <        sum = 0.0; n = 0;
281 >        sum = wtot = brsum = 0.0; n = 0;
282          for (gs = all_srcs; gs != NULL; gs = gs->next) {
283                  p = posindex(gs->dir, midview.vdir, midview.vup);
284                  if (p <= FTINY)
285                          continue;
286                  sum += gs->lum * q(gs->dom) / p;
287 +                brsum += gs->lum * gs->dom;
288 +                wtot += gs->dom;
289                  n++;
290          }
291          if (n == 0)
292                  return(0.0);
293          else
294                  return( pow(
295 <                        .5*sum/pow(direct(gd)+gd->indirect,.44),
295 >                        .5*sum/pow((brsum+(5.-wtot)*gd->indirect/PI)/5.,.44),
296                          pow((double)n, -.0914) ) );
297   #undef q
298   }
# Line 284 | Line 308 | extern double  erf(), erfc();
308  
309  
310   double
311 < gnuth_vcp(gd)           /* compute Gnuth visual comfort probability */
311 > guth_vcp(gd)            /* compute Guth visual comfort probability */
312   struct glare_dir        *gd;
313   {
314 <        return(100.*norm_integral(-6.374+1.3227*log(gnuth_dgr(gd))));
314 >        return(100.*norm_integral(6.374-1.3227*log(guth_dgr(gd))));
315   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines