--- ray/src/util/findglare.c 1991/03/21 17:11:46 1.11 +++ ray/src/util/findglare.c 1991/04/02 16:47:03 1.14 @@ -12,6 +12,8 @@ static char SCCSid[] = "$SunId$ LBL"; #include "glare.h" +#include "random.h" + #define FEQ(a,b) ((a)-(b)<=FTINY&&(a)-(b)<=FTINY) #define VEQ(v1,v2) (FEQ((v1)[0],(v2)[0])&&FEQ((v1)[1],(v2)[1]) \ &&FEQ((v1)[2],(v2)[2])) @@ -40,7 +42,10 @@ int hlim; /* central limit of horizontal */ struct illum *indirect; /* array of indirect illuminances */ +long npixinvw; /* number of pixels in view */ +long npixmiss; /* number of pixels missed */ + main(argc, argv) int argc; char *argv[]; @@ -223,6 +228,7 @@ init() /* initialize global variables */ indirect = (struct illum *)calloc(nglardirs, sizeof(struct illum)); if (indirect == NULL) memerr("indirect illuminances"); + npixinvw = npixmiss = 0L; copystruct(&leftview, &ourview); copystruct(&rightview, &ourview); spinvector(leftview.vdir, ourview.vdir, ourview.vup, maxtheta); @@ -276,6 +282,9 @@ cleanup() /* close files, wait for children */ close_pict(); if (octree != NULL) done_rtrace(); + if (npixinvw < 100*npixmiss) + fprintf(stderr, "%s: warning -- missing %ld%% of samples\n", + progname, 100L*npixmiss/npixinvw); } @@ -283,19 +292,24 @@ compdir(vd, x, y) /* compute direction for x,y */ FVECT vd; int x, y; { + long t; FVECT org; /* dummy variable */ if (x <= -hlim) /* left region */ return(viewray(org, vd, &leftview, - (x+hlim)/(2.*sampdens)+.5, - y/(2.*sampdens)+.5)); + (double)(x+hlim)/(2*sampdens)+.5, + (double)y/(2*sampdens)+.5)); if (x >= hlim) /* right region */ return(viewray(org, vd, &rightview, - (x-hlim)/(2.*sampdens)+.5, - y/(2.*sampdens)+.5)); - /* central region */ - if (viewray(org, vd, &ourview, .5, y/(2.*sampdens)+.5) < 0) + (double)(x-hlim)/(2*sampdens)+.5, + (double)y/(2*sampdens)+.5)); + /* central region */ + /* avoid over-counting of poles */ + t = random() % vsize; + if (t*t >= (long)vsize*vsize - (long)y*y) return(-1); + if (viewray(org, vd, &ourview, .5, (double)y/(2*sampdens)+.5) < 0) + return(-1); spinvector(vd, vd, ourview.vup, h_theta(x)); return(0); } @@ -328,7 +342,8 @@ printillum() /* print out indirect illuminances */ printf("BEGIN indirect illuminance\n"); for (i = 0; i < nglardirs; i++) - printf("\t%.0f\t%f\n", (180.0/PI)*indirect[i].theta, - PI * indirect[i].sum / indirect[i].n); + if (indirect[i].n > FTINY) + printf("\t%.0f\t%f\n", (180.0/PI)*indirect[i].theta, + PI * indirect[i].sum / indirect[i].n); printf("END indirect illuminance\n"); }