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

Comparing ray/src/gen/gensky.c (file contents):
Revision 1.6 by greg, Thu Oct 24 13:43:22 1991 UTC vs.
Revision 2.11 by greg, Mon Jun 7 14:51:22 1993 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1986 Regents of the University of California */
1 > /* Copyright (c) 1992 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 32 | Line 32 | extern double  s_latitude;
32   extern double  s_longitude;
33   extern double  s_meridian;
34                                          /* required values */
35 < int  month, day;
36 < double  hour;
35 > int  month, day;                                /* date */
36 > double  hour;                                   /* time */
37 > int  tsolar;                                    /* 0=standard, 1=solar */
38 > double  altitude, azimuth;                      /* or solar angles */
39                                          /* default values */
40 < int  cloudy = 0;
40 > int  cloudy = 0;                                /* 1=standard, 2=uniform */
41   int  dosun = 1;
42   double  zenithbr = -1.0;
43   double  turbidity = 2.75;
# Line 44 | Line 46 | double  gprefl = 0.2;
46   double  sundir[3];
47   double  groundbr;
48   double  F2;
49 < double  solarbr;
49 > double  solarbr = -1.0;
50  
51   char  *progname;
52   char  errmsg[128];
# Line 54 | Line 56 | main(argc, argv)
56   int  argc;
57   char  *argv[];
58   {
57        extern double  atof(), fabs();
59          int  i;
60  
61          progname = argv[0];
# Line 64 | Line 65 | char  *argv[];
65          }
66          if (argc < 4)
67                  userror("arg count");
68 <        month = atoi(argv[1]);
69 <        day = atoi(argv[2]);
70 <        hour = atof(argv[3]);
68 >        if (!strcmp(argv[1], "-ang")) {
69 >                altitude = atof(argv[2]) * (PI/180);
70 >                azimuth = atof(argv[3]) * (PI/180);
71 >                month = 0;
72 >        } else {
73 >                month = atoi(argv[1]);
74 >                if (month < 1 || month > 12)
75 >                        userror("bad month");
76 >                day = atoi(argv[2]);
77 >                if (day < 1 || day > 31)
78 >                        userror("bad day");
79 >                hour = atof(argv[3]);
80 >                if (hour < 0 || hour >= 24)
81 >                        userror("bad hour");
82 >                tsolar = argv[3][0] == '+';
83 >        }
84          for (i = 4; i < argc; i++)
85                  if (argv[i][0] == '-' || argv[i][0] == '+')
86                          switch (argv[i][1]) {
# Line 74 | Line 88 | char  *argv[];
88                                  cloudy = 0;
89                                  dosun = argv[i][0] == '+';
90                                  break;
91 +                        case 'r':
92 +                                solarbr = atof(argv[++i]);
93 +                                break;
94                          case 'c':
95 <                                cloudy = 1;
95 >                                cloudy = argv[i][0] == '+' ? 2 : 1;
96                                  dosun = 0;
97                                  break;
98                          case 't':
# Line 117 | Line 134 | char  *argv[];
134  
135   computesky()                    /* compute sky parameters */
136   {
120        int  jd;
121        double  sd, st;
122        double  altitude, azimuth;
137                                          /* compute solar direction */
138 <        jd = jdate(month, day);                 /* Julian date */
139 <        sd = sdec(jd);                          /* solar declination */
140 <        st = hour + stadj(jd);                  /* solar time */
141 <        altitude = salt(sd, st);
142 <        azimuth = sazi(sd, st);
138 >        if (month) {                    /* from date and time */
139 >                int  jd;
140 >                double  sd, st;
141 >
142 >                jd = jdate(month, day);         /* Julian date */
143 >                sd = sdec(jd);                  /* solar declination */
144 >                if (tsolar)                     /* solar time */
145 >                        st = hour;
146 >                else
147 >                        st = hour + stadj(jd);
148 >                altitude = salt(sd, st);
149 >                azimuth = sazi(sd, st);
150 >                printf("# Solar altitude and azimuth: %f %f\n",
151 >                                180./PI*altitude, 180./PI*azimuth);
152 >        }
153 >        if (!cloudy && altitude > 87.*PI/180.) {
154 >                fprintf(stderr,
155 > "%s: warning - sun too close to zenith, reducing altitude to 87 degrees\n",
156 >                                progname);
157 >                printf(
158 > "# warning - sun too close to zenith, reducing altitude to 87 degrees\n");
159 >                altitude = 87.*PI/180.;
160 >        }
161          sundir[0] = -sin(azimuth)*cos(altitude);
162          sundir[1] = -cos(azimuth)*cos(altitude);
163          sundir[2] = sin(altitude);
# Line 134 | Line 166 | computesky()                   /* compute sky parameters */
166          if (zenithbr <= 0.0)
167                  if (cloudy) {
168                          zenithbr = 8.6*sundir[2] + .123;
169 <                        zenithbr *= 1000.0/SKYEFFICACY;
169 >                        zenithbr *= 1000.0/WHTEFFICACY;
170                  } else {
171                          zenithbr = (1.376*turbidity-1.81)*tan(altitude)+0.38;
172                          zenithbr *= 1000.0/SKYEFFICACY;
# Line 143 | Line 175 | computesky()                   /* compute sky parameters */
175                  zenithbr = 0.0;
176                                          /* Compute horizontal radiance */
177          if (cloudy) {
178 <                groundbr = zenithbr*0.777778;
178 >                if (cloudy == 2)
179 >                        groundbr = zenithbr;
180 >                else
181 >                        groundbr = zenithbr*0.777778;
182                  printf("# Ground ambient level: %f\n", groundbr);
183          } else {
184                  F2 = 0.274*(0.91 + 10.0*exp(-3.0*(PI/2.0-altitude)) +
185                                  0.45*sundir[2]*sundir[2]);
186 <                groundbr = zenithbr*normsc(PI/2.0-altitude)/F2/PI;
186 >                groundbr = zenithbr*normsc(altitude)/F2/PI;
187                  printf("# Ground ambient level: %f\n", groundbr);
188 <                if (sundir[2] > 0.0) {
189 <                        if (sundir[2] > .16)
190 <                                solarbr = (1.5e9/SUNEFFICACY) *
191 <                                        (1.147 - .147/sundir[2]);
157 <                        else
158 <                                solarbr = 1.5e9/SUNEFFICACY*(1.147-.147/.16);
188 >                if (sundir[2] > 0.0 && solarbr != 0.0) {
189 >                        if (solarbr < 0.0)
190 >                                solarbr = 1.5e9/SUNEFFICACY *
191 >                                (1.147 - .147/(sundir[2]>.16?sundir[2]:.16));
192                          groundbr += solarbr*6e-5*sundir[2]/PI;
193                  } else
194                          dosun = 0;
# Line 179 | Line 212 | printsky()                     /* print out sky */
212          printf("2 skybright skybright.cal\n");
213          printf("0\n");
214          if (cloudy)
215 <                printf("3 1 %.2e %.2e\n", zenithbr, groundbr);
215 >                printf("3 %d %.2e %.2e\n", cloudy, zenithbr, groundbr);
216          else
217                  printf("7 -1 %.2e %.2e %.2e %f %f %f\n", zenithbr, groundbr,
218                                  F2, sundir[0], sundir[1], sundir[2]);
# Line 188 | Line 221 | printsky()                     /* print out sky */
221  
222   printdefaults()                 /* print default values */
223   {
224 <        if (cloudy)
224 >        if (cloudy == 1)
225                  printf("-c\t\t\t\t# Cloudy sky\n");
226 +        else if (cloudy == 2)
227 +                printf("+c\t\t\t\t# Uniform cloudy sky\n");
228          else if (dosun)
229                  printf("+s\t\t\t\t# Sunny sky with sun\n");
230          else
# Line 211 | Line 246 | char  *msg;
246          if (msg != NULL)
247                  fprintf(stderr, "%s: Use error - %s\n", progname, msg);
248          fprintf(stderr, "Usage: %s month day hour [options]\n", progname);
249 +        fprintf(stderr, "   Or: %s -ang altitude azimuth [options]\n", progname);
250          fprintf(stderr, "   Or: %s -defaults\n", progname);
251          exit(1);
252   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines