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

Comparing ray/src/gen/genblinds.c (file contents):
Revision 2.7 by greg, Mon Oct 10 12:07:45 1994 UTC vs.
Revision 2.11 by schorsch, Sun Nov 16 10:29:38 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1986 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  genblind2.c - make some curved or flat venetian blinds.
6   *
# Line 19 | Line 16 | static char SCCSid[] = "$SunId$ LBL";
16   */
17  
18   #include  <stdio.h>
19 + #include <stdlib.h>
20   #include  <math.h>
21 + #include  <string.h>
22  
23   #define  PI             3.14159265358979323846
24   #define  DELTA          10.  /*  MINIMAL SUSTAINED ANGLE IN DEGREES */
# Line 30 | Line 29 | char  *material, *name;
29   double  height;
30   int  nslats,  nsurf;
31  
33 #ifdef  DCL_ATOF
34 extern double  atof();
35 #endif
32  
33 + static void makeflat(double w, double d, double a);
34 + static void printslat(int n);
35 + static void printhead(register int  ac, register char  **av);
36  
37 < main(argc, argv)
38 < int  argc;
39 < char  *argv[];
37 >
38 > void
39 > makeflat(
40 >        double w,
41 >        double d,
42 >        double a
43 > )
44   {
45 <        double  width, delem, depth, rcurv = 0.0, angle;
43 <        double  beta, gamma, theta, chi;
44 <        int     i, j, k, l;
45 >        double  h;
46  
47 +        h = d*sin(a);
48 +        d *= cos(a);
49 +        baseflat[0][0] = 0.0;
50 +        baseflat[0][1] = 0.0;
51 +        baseflat[0][2] = 0.0;
52 +        baseflat[1][0] = 0.0;
53 +        baseflat[1][1] = w;
54 +        baseflat[1][2] = 0.0;
55 +        baseflat[2][0] = d;
56 +        baseflat[2][1] = w;
57 +        baseflat[2][2] = h;
58 +        baseflat[3][0] = d;
59 +        baseflat[3][1] = 0.0;
60 +        baseflat[3][2] = h;
61  
62 <        if (argc != 8 && argc != 10)
48 <                goto userr;
49 <        material = argv[1];
50 <        name = argv[2];
51 <        depth = atof(argv[3]);
52 <        width = atof(argv[4]);
53 <        height = atof(argv[5]);
54 <        nslats  = atoi(argv[6]);
55 <        angle = atof(argv[7]);
56 <        if (argc == 10)
57 <                if (!strcmp(argv[8], "-r"))
58 <                        rcurv = atof(argv[9]);
59 <                else if (!strcmp(argv[8], "+r"))
60 <                        rcurv = -atof(argv[9]);
61 <                else
62 <                        goto userr;
62 > }
63  
64 /* CURVED BLIND CALCULATION */
64  
65 <        if (rcurv != 0) {
65 > void
66 > printslat(                      /* print slat # n */
67 >        int  n
68 > )
69 > {
70 >        register int  i, k;
71  
72 +        for (k=0; k < nsurf; k++)  {
73 +                printf("\n%s polygon %s.%d.%d\n", material, name, n, k);
74 +                printf("0\n0\n12\n");
75 +                for (i = 0; i < 4; i++)
76 +                        printf("\t%18.12g\t%18.12g\t%18.12g\n",
77 +                                baseblind[i][0][k],
78 +                                baseblind[i][1][k],
79 +                                baseblind[i][2][k] + height*(n-.5)/nslats);
80 +        }              
81 + }
82 +
83 +
84 + void
85 + printhead(              /* print command header */
86 +        register int  ac,
87 +        register char  **av
88 + )
89 + {
90 +        putchar('#');
91 +        while (ac--) {
92 +                putchar(' ');
93 +                fputs(*av++, stdout);
94 +        }
95 +        putchar('\n');
96 + }
97 +
98 +
99 + int
100 + main(
101 +        int  argc,
102 +        char  *argv[]
103 + )
104 + {
105 +    double  width, delem, depth, rcurv = 0.0, angle;
106 +    double  beta, gamma, theta, chi = 0;
107 +    int     i, j, k, l;
108 +
109 +
110 +    if (argc != 8 && argc != 10)
111 +        goto userr;
112 +    material = argv[1];
113 +    name = argv[2];
114 +    depth = atof(argv[3]);
115 +    width = atof(argv[4]);
116 +    height = atof(argv[5]);
117 +    nslats  = atoi(argv[6]);
118 +    angle = atof(argv[7]);
119 +    if (argc == 10)
120 +        if (!strcmp(argv[8], "-r"))
121 +            rcurv = atof(argv[9]);
122 +        else if (!strcmp(argv[8], "+r"))
123 +            rcurv = -atof(argv[9]);
124 +        else
125 +            goto userr;
126 +
127 +    /* CURVED BLIND CALCULATION */
128 +
129 +    if (rcurv != 0) {
130 +
131          /* BLINDS SUSTAINED ANGLE */
132  
133          theta = 2*asin(depth/(2*fabs(rcurv)));
134  
135 <        /* HOW MANY ELEMENTARY SURFACES SHOULD BE CALCULATED ? */
135 >        /* HOW MANY ELEMENTARY SURFACES SHOULD BE CALCULATED ? */
136  
137 <        nsurf = (theta / ((PI/180.)*DELTA));
137 >        nsurf = (int)(theta / ((PI/180.)*DELTA)) + 1;
138  
139          /* WHAT IS THE DEPTH OF THE ELEMENTARY SURFACES ? */
140  
# Line 83 | Line 146 | char  *argv[];
146  
147  
148          if (rcurv < 0) {
149 <                A[0]=fabs(rcurv)*cos(gamma);
150 <                A[0] *= -1;
151 <                A[1]=0.;
152 <                A[2]=fabs(rcurv)*sin(gamma);
149 >            A[0]=fabs(rcurv)*cos(gamma);
150 >            A[0] *= -1;
151 >            A[1]=0.;
152 >            A[2]=fabs(rcurv)*sin(gamma);
153          }
154          if (rcurv > 0) {
155 <                A[0]=fabs(rcurv)*cos(gamma+theta);
156 <                A[1]=0.;
157 <                A[2]=fabs(rcurv)*sin(gamma+theta);
158 <                A[2] *= -1;
155 >            A[0]=fabs(rcurv)*cos(gamma+theta);
156 >            A[1]=0.;
157 >            A[2]=fabs(rcurv)*sin(gamma+theta);
158 >            A[2] *= -1;
159          }
160  
161          for (k=0; k < nsurf; k++) {
162 <        if (rcurv < 0) {
163 <        chi=(PI/180.)*((180.-DELTA)/2.) - (gamma+(k*(PI/180.)*DELTA));
164 <        }
165 <        if (rcurv > 0) {
166 <        chi=(PI-(gamma+theta)+(k*(PI/180.)*DELTA))-(PI/180.)*  
167 <        ((180.-DELTA)/2.);
168 <        }
169 <                makeflat(width, delem, chi);
170 <        if (rcurv < 0.) {
162 >            if (rcurv < 0) {
163 >                chi=(PI/180.)*((180.-DELTA)/2.) - (gamma+(k*(PI/180.)*DELTA));
164 >            }
165 >            if (rcurv > 0) {
166 >                chi=(PI-(gamma+theta)+(k*(PI/180.)*DELTA))-(PI/180.)*  
167 >                    ((180.-DELTA)/2.);
168 >            }
169 >            makeflat(width, delem, chi);
170 >            if (rcurv < 0.) {
171                  X[0]=(-fabs(rcurv))*cos(gamma+(k*(PI/180.)*DELTA))-A[0];
172                  X[1]=0.;
173                  X[2]=fabs(rcurv)*sin(gamma+(k*(PI/180.)*DELTA))-A[2];
174 <        }
175 <        if (rcurv > 0.) {
174 >            }
175 >            if (rcurv > 0.) {
176                  X[0]=fabs(rcurv)*cos(gamma+theta-(k*(PI/180.)*DELTA))-A[0];
177                  X[1]=0.;
178                  X[2]=(-fabs(rcurv))*sin(gamma+theta-(k*(PI/180.)*DELTA))-A[2];
179 <        }
179 >            }
180  
181 <                for (i=0; i < 4; i++)  {
182 <                    for (j=0; j < 3; j++) {
183 <                        baseblind[i][j][k] = baseflat[i][j]+X[j];
184 <                    }
185 <                }      
123 <        }
181 >            for (i=0; i < 4; i++)  {
182 >                for (j=0; j < 3; j++) {
183 >                    baseblind[i][j][k] = baseflat[i][j]+X[j];
184 >                }
185 >            }  
186          }
187 +    }
188  
189 < /* FLAT BLINDS CALCULATION */
127 <        
128 <        if (rcurv == 0.) {
189 >    /* FLAT BLINDS CALCULATION */
190  
191 <                nsurf=1;
192 <                makeflat(width,depth,angle*(PI/180.));
193 <                for (i=0; i < 4; i++) {
194 <                    for (j=0; j < 3; j++) {
195 <                        baseblind[i][j][0] = baseflat[i][j];
196 <                    }
197 <                }
191 >    if (rcurv == 0.) {
192 >
193 >        nsurf=1;
194 >        makeflat(width,depth,angle*(PI/180.));
195 >        for (i=0; i < 4; i++) {
196 >            for (j=0; j < 3; j++) {
197 >                baseblind[i][j][0] = baseflat[i][j];
198 >            }
199          }
200 <        
139 <        printhead(argc, argv);
200 >    }
201  
202 +    printhead(argc, argv);
203  
142 /* REPEAT THE BASIC CURVED OR FLAT SLAT TO GET THE OVERALL BLIND */
204  
205 <        for (l = 1; l <= nslats; l++)
206 <                printslat(l);
207 <        exit(0);
205 >    /* REPEAT THE BASIC CURVED OR FLAT SLAT TO GET THE OVERALL BLIND */
206 >
207 >    for (l = 1; l <= nslats; l++)
208 >        printslat(l);
209 >    exit(0);
210   userr:
211 <        fprintf(stderr,
212 <        "Usage: %s mat name depth width height nslats angle [-r|+r rcurv]\n",
213 <                        argv[0]);
214 <        exit(1);
211 >    fprintf(stderr,
212 >            "Usage: %s mat name depth width height nslats angle [-r|+r rcurv]\n",
213 >            argv[0]);
214 >    exit(1);
215   }
216  
217  
155 makeflat(w,d,a)
156 double  w, d, a;
157 {
158        double  h;
218  
160        h = d*sin(a);
161        d *= cos(a);
162        baseflat[0][0] = 0.0;
163        baseflat[0][1] = 0.0;
164        baseflat[0][2] = 0.0;
165        baseflat[1][0] = 0.0;
166        baseflat[1][1] = w;
167        baseflat[1][2] = 0.0;
168        baseflat[2][0] = d;
169        baseflat[2][1] = w;
170        baseflat[2][2] = h;
171        baseflat[3][0] = d;
172        baseflat[3][1] = 0.0;
173        baseflat[3][2] = h;
174
175 }
176
177
178 printslat(n)                    /* print slat # n */
179 int  n;
180 {
181        register int  i, k;
182
183        for (k=0; k < nsurf; k++)  {
184                printf("\n%s polygon %s.%d.%d\n", material, name, n, k);
185                printf("0\n0\n12\n");
186                for (i = 0; i < 4; i++)
187                        printf("\t%18.12g\t%18.12g\t%18.12g\n",
188                                baseblind[i][0][k],
189                                baseblind[i][1][k],
190                                baseblind[i][2][k] + height*(n-.5)/nslats);
191        }              
192 }
193
194
195 printhead(ac, av)               /* print command header */
196 register int  ac;
197 register char  **av;
198 {
199        putchar('#');
200        while (ac--) {
201                putchar(' ');
202                fputs(*av++, stdout);
203        }
204        putchar('\n');
205 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines