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.10 by schorsch, Sun Jun 8 12:03:09 2003 UTC vs.
Revision 2.12 by greg, Wed Dec 28 19:42:13 2005 UTC

# Line 30 | Line 30 | double  height;
30   int  nslats,  nsurf;
31  
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 < makeflat(w,d,a)
38 < double  w, d, a;
37 >
38 > void
39 > makeflat(
40 >        double w,
41 >        double d,
42 >        double a
43 > )
44   {
45          double  h;
46  
# Line 54 | Line 62 | double  w, d, a;
62   }
63  
64  
65 < printslat(n)                    /* print slat # n */
66 < int  n;
65 > void
66 > printslat(                      /* print slat # n */
67 >        int  n
68 > )
69   {
70          register int  i, k;
71  
# Line 71 | Line 81 | int  n;
81   }
82  
83  
84 < printhead(ac, av)               /* print command header */
85 < register int  ac;
86 < register char  **av;
84 > void
85 > printhead(              /* print command header */
86 >        register int  ac,
87 >        register char  **av
88 > )
89   {
90          putchar('#');
91          while (ac--) {
# Line 84 | Line 96 | register char  **av;
96   }
97  
98  
99 < main(argc, argv)
100 < int  argc;
101 < char  *argv[];
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;
107 <        int     i, j, k, l;
105 >    double  width, delem, depth, rcurv = 0.0, mydelta, 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;
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 */
127 >    /* CURVED BLIND CALCULATION */
128  
129 <        if (rcurv != 0) {
129 >    if (rcurv != 0.) {
130  
131          /* BLINDS SUSTAINED ANGLE */
132  
133 <        theta = 2*asin(depth/(2*fabs(rcurv)));
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 = (int)(theta / ((PI/180.)*DELTA)) + 1;
137 >        nsurf = (int)(theta / ((PI/180.)*DELTA) + 0.99999);
138 >        
139 >        mydelta = (180./PI) * theta / nsurf;
140  
141          /* WHAT IS THE DEPTH OF THE ELEMENTARY SURFACES ? */
142  
143 <        delem = 2*fabs(rcurv)*sin((PI/180.)*(DELTA/2.));
143 >        delem = 2.*fabs(rcurv)*sin((PI/180.)*(mydelta/2.));
144  
145          beta = (PI-theta)/2.;
146          gamma = beta -((PI/180.)*angle);
# Line 132 | Line 148 | char  *argv[];
148  
149  
150          if (rcurv < 0) {
151 <                A[0]=fabs(rcurv)*cos(gamma);
152 <                A[0] *= -1;
153 <                A[1]=0.;
154 <                A[2]=fabs(rcurv)*sin(gamma);
151 >            A[0]=fabs(rcurv)*cos(gamma);
152 >            A[0] *= -1.;
153 >            A[1]=0.;
154 >            A[2]=fabs(rcurv)*sin(gamma);
155          }
156          if (rcurv > 0) {
157 <                A[0]=fabs(rcurv)*cos(gamma+theta);
158 <                A[1]=0.;
159 <                A[2]=fabs(rcurv)*sin(gamma+theta);
160 <                A[2] *= -1;
157 >            A[0]=fabs(rcurv)*cos(gamma+theta);
158 >            A[1]=0.;
159 >            A[2]=fabs(rcurv)*sin(gamma+theta);
160 >            A[2] *= -1.;
161          }
162  
163          for (k=0; k < nsurf; k++) {
164 <        if (rcurv < 0) {
165 <        chi=(PI/180.)*((180.-DELTA)/2.) - (gamma+(k*(PI/180.)*DELTA));
166 <        }
167 <        if (rcurv > 0) {
168 <        chi=(PI-(gamma+theta)+(k*(PI/180.)*DELTA))-(PI/180.)*  
169 <        ((180.-DELTA)/2.);
170 <        }
171 <                makeflat(width, delem, chi);
172 <        if (rcurv < 0.) {
173 <                X[0]=(-fabs(rcurv))*cos(gamma+(k*(PI/180.)*DELTA))-A[0];
164 >            if (rcurv < 0) {
165 >                chi=(PI/180.)*((180.-mydelta)/2.) - (gamma+(k*(PI/180.)*mydelta));
166 >            }
167 >            if (rcurv > 0) {
168 >                chi=(PI-(gamma+theta)+(k*(PI/180.)*mydelta))-(PI/180.)*  
169 >                    ((180.-mydelta)/2.);
170 >            }
171 >            makeflat(width, delem, chi);
172 >            if (rcurv < 0.) {
173 >                X[0]=(-fabs(rcurv))*cos(gamma+(k*(PI/180.)*mydelta))-A[0];
174                  X[1]=0.;
175 <                X[2]=fabs(rcurv)*sin(gamma+(k*(PI/180.)*DELTA))-A[2];
176 <        }
177 <        if (rcurv > 0.) {
178 <                X[0]=fabs(rcurv)*cos(gamma+theta-(k*(PI/180.)*DELTA))-A[0];
175 >                X[2]=fabs(rcurv)*sin(gamma+(k*(PI/180.)*mydelta))-A[2];
176 >            }
177 >            if (rcurv > 0.) {
178 >                X[0]=fabs(rcurv)*cos(gamma+theta-(k*(PI/180.)*mydelta))-A[0];
179                  X[1]=0.;
180 <                X[2]=(-fabs(rcurv))*sin(gamma+theta-(k*(PI/180.)*DELTA))-A[2];
181 <        }
180 >                X[2]=(-fabs(rcurv))*sin(gamma+theta-(k*(PI/180.)*mydelta))-A[2];
181 >            }
182  
183 <                for (i=0; i < 4; i++)  {
184 <                    for (j=0; j < 3; j++) {
185 <                        baseblind[i][j][k] = baseflat[i][j]+X[j];
186 <                    }
187 <                }      
172 <        }
183 >            for (i=0; i < 4; i++)  {
184 >                for (j=0; j < 3; j++) {
185 >                    baseblind[i][j][k] = baseflat[i][j]+X[j];
186 >                }
187 >            }  
188          }
189 +    }
190  
191 < /* FLAT BLINDS CALCULATION */
176 <        
177 <        if (rcurv == 0.) {
191 >    /* FLAT BLINDS CALCULATION */
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 <                }
193 >    else {
194 >
195 >        nsurf=1;
196 >        makeflat(width,depth,angle*(PI/180.));
197 >        for (i=0; i < 4; i++) {
198 >            for (j=0; j < 3; j++) {
199 >                baseblind[i][j][0] = baseflat[i][j];
200 >            }
201          }
202 <        
188 <        printhead(argc, argv);
202 >    }
203  
204 +    printhead(argc, argv);
205  
191 /* 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);
207 >    /* REPEAT THE BASIC CURVED OR FLAT SLAT TO GET THE OVERALL BLIND */
208 >
209 >    for (l = 1; l <= nslats; l++)
210 >        printslat(l);
211 >    exit(0);
212   userr:
213 <        fprintf(stderr,
214 <        "Usage: %s mat name depth width height nslats angle [-r|+r rcurv]\n",
215 <                        argv[0]);
216 <        exit(1);
213 >    fprintf(stderr,
214 >            "Usage: %s mat name depth width height nslats angle [-r|+r rcurv]\n",
215 >            argv[0]);
216 >    exit(1);
217   }
218  
219  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines