home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / NEWS / RADIANCE / SRC / CV / SKY2RAD.C < prev    next >
C/C++ Source or Header  |  1993-10-07  |  3KB  |  129 lines

  1. /*
  2.  * Convert Leicester sky luminance data to Radiance input.
  3.  */
  4.  
  5. #include <stdio.h>
  6.  
  7. #include "color.h"
  8.  
  9.  
  10. #define  PI        3.14159265358979323846
  11.  
  12. #define  MAXLUMINANCE    60000.0
  13. #define  LUMERR        99997.5
  14.  
  15. #define  MAXSAMP    30
  16. #define  NROWS        8
  17.  
  18. short  nv_row[NROWS] = {30, 30, 24, 24, 18, 12, 6, 6};
  19.  
  20.  
  21. main(argc, argv)
  22. int    argc;
  23. char    **argv;
  24. {
  25.     extern double  sin(), cos();
  26.     char    fbuf[64];
  27.     int    day, hour, minute;
  28.     double    v[3], d;
  29.     double    sill, salt, sazi;
  30.  
  31.     if (argc == 3 && !strcmp(argv[1], "-s"))
  32.         sill = atof(argv[2]);
  33.     else
  34.         sill = 0.0;
  35.  
  36.     while (scanf("%d %d %d %lf %lf", &day, &hour, &minute,
  37.             &salt, &sazi) == 5) {
  38.         sprintf(fbuf, "day%03d_%02d:%02d.dat", day,hour,minute);
  39.         printf("\nvoid brightdata sky%03d_%02d:%02d\n",day,hour,minute);
  40.         printf("5 noneg %s . Asin(Dz)/DEGREE ", fbuf);
  41.         printf("mod(atan2(Dx,Dy)/DEGREE-%g,360)\n", sazi);
  42.         printf("0\n0\n");
  43.         cvdata(fbuf);
  44.     }
  45.     if (sill > 0.0) {
  46.         salt *= PI/180.0;
  47.         sazi *= PI/180.0;
  48.         v[0] = cos(salt);
  49.         v[1] = v[0]*cos(sazi);
  50.         v[0] *= sin(sazi);
  51.         v[2] = sin(salt);
  52.         d = sill/5.981e-5/SUNEFFICACY/v[2];
  53.         printf("\nvoid light solar\n");
  54.         printf("0\n0\n3 %f %f %f\n", d, d, d);
  55.         printf("\nsolar source sun\n");
  56.         printf("0\n0\n4 %f %f %f 0.5\n", v[0], v[1], v[2]);
  57.     }
  58.     exit(0);
  59. }
  60.  
  61.  
  62. cvdata(fname)            /* convert data to Radiance format */
  63. char    *fname;
  64. {
  65.     double    row[MAXSAMP];
  66.     int    i;
  67.     register int    j;
  68.     FILE    *fp;
  69.  
  70.     if ((fp = fopen(fname, "w")) == NULL) {
  71.         perror(fname);
  72.         exit(1);
  73.     }
  74.     fprintf(fp, "2\n6 90 %d\n0 360 %d\n", NROWS, MAXSAMP+1);
  75.     for (i = 0; i < NROWS; i++) {
  76.         for (j = 0; j < nv_row[i]; j++) {
  77.             if (scanf("%lf", &row[j]) != 1) {
  78.                 fprintf(stderr, "%s: data format error\n",
  79.                         fname);
  80.                 exit(1);
  81.             }
  82.             if (row[j] >= LUMERR)    /* overrange */
  83.                 row[j] = j ? row[j-1] : MAXLUMINANCE;
  84.         }
  85.         if (i == NROWS-1) {        /* average zenith values */
  86.             for (j = 1; j < nv_row[i]; j++)
  87.                 row[0] += row[j];
  88.             row[0] /= (double)nv_row[i];
  89.             cvrow(row, 1, fp);
  90.         } else
  91.             cvrow(row, nv_row[i], fp);
  92.     }
  93.     putc('\n', fp);
  94.     if (fclose(fp) == -1) {
  95.         perror(fname);
  96.         exit(1);
  97.     }
  98. }
  99.  
  100.  
  101. cvrow(rp, n, fp)        /* resample and print row to fp */
  102. register double    *rp;
  103. int    n;
  104. FILE    *fp;
  105. {
  106.     double  nrow[MAXSAMP+1];
  107.     double  x;
  108.     register int    i, j;
  109.                     /* resample row if necessary */
  110.     if (n < MAXSAMP)
  111.         for (i = 0; i < MAXSAMP; i++) {
  112.             j = x = (double)i*n/MAXSAMP;
  113.             if (j > n-2)
  114.                 j = n-2;
  115.             x -= (double)j;
  116.             nrow[i] = rp[j]*(1.-x) + rp[j+1]*x;
  117.         }
  118.     else
  119.         for (i = 0; i < MAXSAMP; i++)
  120.             nrow[i] = rp[i];
  121.     nrow[MAXSAMP] = rp[0];
  122.                     /* print full row */
  123.     for (i = 0; i <= MAXSAMP; i++) {
  124.         if (i%5 == 0)
  125.             putc('\n', fp);
  126.         fprintf(fp, " %4.4f", nrow[i]/SKYEFFICACY);
  127.     }
  128. }
  129.