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

Comparing ray/src/gen/genprism.c (file contents):
Revision 2.7 by greg, Tue Mar 19 20:59:22 1996 UTC vs.
Revision 2.9 by schorsch, Sun Jun 8 12:03:09 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1996 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   *  genprism.c - generate a prism.
6   *              2D vertices in the xy plane are given on the
# Line 13 | Line 10 | static char SCCSid[] = "$SunId$ LBL";
10   */
11  
12   #include  <stdio.h>
13 <
13 > #include  <string.h>
14 > #include <stdlib.h>
15   #include  <math.h>
18
16   #include  <ctype.h>
17  
18   #define  MAXVERT        1024            /* maximum # vertices */
19  
20   #define  FTINY          1e-6
21  
25 #ifdef  DCL_ATOF
26 extern double  atof();
27 #endif
28
22   char  *pmtype;          /* material type */
23   char  *pname;           /* name */
24  
# Line 46 | Line 39 | double  crad = 0.0;            /* radius for corners (sign from
39   extern double  compute_rounding();
40  
41  
42 < main(argc, argv)
50 < int  argc;
51 < char  **argv;
52 < {
53 <        int  an;
54 <        
55 <        if (argc < 4)
56 <                goto userr;
57 <
58 <        pmtype = argv[1];
59 <        pname = argv[2];
60 <
61 <        if (!strcmp(argv[3], "-")) {
62 <                readverts(NULL);
63 <                an = 4;
64 <        } else if (isdigit(argv[3][0])) {
65 <                nverts = atoi(argv[3]);
66 <                if (argc-3 < 2*nverts)
67 <                        goto userr;
68 <                for (an = 0; an < nverts; an++) {
69 <                        vert[an][0] = atof(argv[2*an+4]);
70 <                        vert[an][1] = atof(argv[2*an+5]);
71 <                }
72 <                an = 2*nverts+4;
73 <        } else {
74 <                readverts(argv[3]);
75 <                an = 4;
76 <        }
77 <        if (nverts < 3) {
78 <                fprintf(stderr, "%s: not enough vertices\n", argv[0]);
79 <                exit(1);
80 <        }
81 <
82 <        for ( ; an < argc; an++) {
83 <                if (argv[an][0] != '-')
84 <                        goto userr;
85 <                switch (argv[an][1]) {
86 <                case 'l':                               /* length vector */
87 <                        lvect[0] = atof(argv[++an]);
88 <                        lvect[1] = atof(argv[++an]);
89 <                        lvect[2] = atof(argv[++an]);
90 <                        if (lvect[2] < -FTINY)
91 <                                lvdir = -1;
92 <                        else if (lvect[2] > FTINY)
93 <                                lvdir = 1;
94 <                        else {
95 <                                fprintf(stderr,
96 <                                        "%s: illegal extrusion vector\n",
97 <                                                argv[0]);
98 <                                exit(1);
99 <                        }
100 <                        llen = sqrt(lvect[0]*lvect[0] + lvect[1]*lvect[1] +
101 <                                        lvect[2]*lvect[2]);
102 <                        break;
103 <                case 'r':                               /* radius */
104 <                        crad = atof(argv[++an]);
105 <                        break;
106 <                case 'e':                               /* ends */
107 <                        do_ends = !do_ends;
108 <                        break;
109 <                case 'c':                               /* complete */
110 <                        iscomplete = !iscomplete;
111 <                        break;
112 <                default:
113 <                        goto userr;
114 <                }
115 <        }
116 <        if (crad > FTINY) {
117 <                if (crad > lvdir*lvect[2]) {
118 <                        fprintf(stderr, "%s: rounding greater than height\n",
119 <                                        argv[0]);
120 <                        exit(1);
121 <                }
122 <                crad *= lvdir;          /* simplifies formulas */
123 <                compute_rounding();
124 <                printhead(argc, argv);
125 <                if (do_ends)
126 <                        printrends();
127 <                printsides(1);
128 <        } else {
129 <                printhead(argc, argv);
130 <                if (do_ends)
131 <                        printends();
132 <                printsides(0);
133 <        }
134 <        exit(0);
135 < userr:
136 <        fprintf(stderr, "Usage: %s material name ", argv[0]);
137 <        fprintf(stderr, "{ - | vfile | N v1 v2 .. vN } ");
138 <        fprintf(stderr, "[-l lvect][-r radius][-c][-e]\n");
139 <        exit(1);
140 < }
141 <
142 <
42 > static void
43   readverts(fname)                /* read vertices from a file */
44   char  *fname;
45   {
# Line 157 | Line 57 | char  *fname;
57   }
58  
59  
60 < double
60 > static void
61 > side(n0, n1)                    /* print single side */
62 > register int  n0, n1;
63 > {
64 >        printf("\n%s polygon %s.%d\n", pmtype, pname, n0+1);
65 >        printf("0\n0\n12\n");
66 >        printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n0][0],
67 >                        vert[n0][1], 0.0);
68 >        printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n0][0]+lvect[0],
69 >                        vert[n0][1]+lvect[1], lvect[2]);
70 >        printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n1][0]+lvect[0],
71 >                        vert[n1][1]+lvect[1], lvect[2]);
72 >        printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n1][0],
73 >                        vert[n1][1], 0.0);
74 > }
75 >
76 >
77 > static void
78 > rside(n0, n1)                   /* print side with rounded edge */
79 > register int  n0, n1;
80 > {
81 >        double  s, c, t[3];
82 >
83 >                                        /* compute tanget offset vector */
84 >        s = lvdir*(lvect[1]*u[n1][0] - lvect[0]*u[n1][1])/llen;
85 >        if (s < -FTINY || s > FTINY) {
86 >                c = sqrt(1. - s*s);
87 >                t[0] = (c - 1.)*u[n1][1];
88 >                t[1] = (1. - c)*u[n1][0];
89 >                t[2] = s;
90 >        } else
91 >                t[0] = t[1] = t[2] = 0.;
92 >                                        /* output side */
93 >        printf("\n%s polygon %s.%d\n", pmtype, pname, n0+1);
94 >        printf("0\n0\n12\n");
95 >        printf("\t%18.12g\t%18.12g\t%18.12g\n",
96 >                        vert[n0][0] + crad*(t[0] - a[n0]*u[n1][0]),
97 >                        vert[n0][1] + crad*(t[1] - a[n0]*u[n1][1]),
98 >                        crad*(t[2] + 1.));
99 >        printf("\t%18.12g\t%18.12g\t%18.12g\n",
100 >                        vert[n0][0] + lvect[0] + crad*(t[0] - a[n0]*u[n1][0]),
101 >                        vert[n0][1] + lvect[1] + crad*(t[1] - a[n0]*u[n1][1]),
102 >                        lvect[2] + crad*(t[2] - 1.));
103 >        printf("\t%18.12g\t%18.12g\t%18.12g\n",
104 >                        vert[n1][0] + lvect[0] + crad*(t[0] + a[n1]*u[n1][0]),
105 >                        vert[n1][1] + lvect[1] + crad*(t[1] + a[n1]*u[n1][1]),
106 >                        lvect[2] + crad*(t[2] - 1.));
107 >        printf("\t%18.12g\t%18.12g\t%18.12g\n",
108 >                        vert[n1][0] + crad*(t[0] + a[n1]*u[n1][0]),
109 >                        vert[n1][1] + crad*(t[1] + a[n1]*u[n1][1]),
110 >                        crad*(t[2] + 1.));
111 >                                        /* output joining edge */
112 >        if (lvdir*a[n1] < 0.)
113 >                return;
114 >        printf("\n%s cylinder %s.e%d\n", pmtype, pname, n0+1);
115 >        printf("0\n0\n7\n");
116 >        printf("\t%18.12g\t%18.12g\t%18.12g\n",
117 >                vert[n1][0] + crad*(a[n1]*u[n1][0] - u[n1][1]),
118 >                vert[n1][1] + crad*(a[n1]*u[n1][1] + u[n1][0]),
119 >                crad);
120 >        printf("\t%18.12g\t%18.12g\t%18.12g\n",
121 >                vert[n1][0] + lvect[0] + crad*(a[n1]*u[n1][0] - u[n1][1]),
122 >                vert[n1][1] + lvect[1] + crad*(a[n1]*u[n1][1] + u[n1][0]),
123 >                lvect[2] - crad);
124 >        printf("\t%18.12g\n", lvdir*crad);
125 > }
126 >
127 >
128 > static double
129   compute_rounding()              /* compute vectors for rounding operations */
130   {
131          register int  i;
# Line 201 | Line 169 | compute_rounding()             /* compute vectors for rounding op
169   }
170  
171  
172 + static void
173   printends()                     /* print ends of prism */
174   {
175          register int  i;
# Line 219 | Line 188 | printends()                    /* print ends of prism */
188   }
189  
190  
191 + static void
192   printrends()                    /* print ends of prism with rounding */
193   {
194          register int  i;
# Line 298 | Line 268 | printrends()                   /* print ends of prism with rounding */
268   }
269  
270  
271 + static void
272   printsides(round)               /* print prism sides */
273   int  round;
274   {
# Line 316 | Line 287 | int  round;
287   }
288  
289  
290 < side(n0, n1)                    /* print single side */
320 < register int  n0, n1;
321 < {
322 <        printf("\n%s polygon %s.%d\n", pmtype, pname, n0+1);
323 <        printf("0\n0\n12\n");
324 <        printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n0][0],
325 <                        vert[n0][1], 0.0);
326 <        printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n0][0]+lvect[0],
327 <                        vert[n0][1]+lvect[1], lvect[2]);
328 <        printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n1][0]+lvect[0],
329 <                        vert[n1][1]+lvect[1], lvect[2]);
330 <        printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n1][0],
331 <                        vert[n1][1], 0.0);
332 < }
333 <
334 <
335 < rside(n0, n1)                   /* print side with rounded edge */
336 < register int  n0, n1;
337 < {
338 <        double  s, c, t[3];
339 <
340 <                                        /* compute tanget offset vector */
341 <        s = lvdir*(lvect[1]*u[n1][0] - lvect[0]*u[n1][1])/llen;
342 <        if (s < -FTINY || s > FTINY) {
343 <                c = sqrt(1. - s*s);
344 <                t[0] = (c - 1.)*u[n1][1];
345 <                t[1] = (1. - c)*u[n1][0];
346 <                t[2] = s;
347 <        } else
348 <                t[0] = t[1] = t[2] = 0.;
349 <                                        /* output side */
350 <        printf("\n%s polygon %s.%d\n", pmtype, pname, n0+1);
351 <        printf("0\n0\n12\n");
352 <        printf("\t%18.12g\t%18.12g\t%18.12g\n",
353 <                        vert[n0][0] + crad*(t[0] - a[n0]*u[n1][0]),
354 <                        vert[n0][1] + crad*(t[1] - a[n0]*u[n1][1]),
355 <                        crad*(t[2] + 1.));
356 <        printf("\t%18.12g\t%18.12g\t%18.12g\n",
357 <                        vert[n0][0] + lvect[0] + crad*(t[0] - a[n0]*u[n1][0]),
358 <                        vert[n0][1] + lvect[1] + crad*(t[1] - a[n0]*u[n1][1]),
359 <                        lvect[2] + crad*(t[2] - 1.));
360 <        printf("\t%18.12g\t%18.12g\t%18.12g\n",
361 <                        vert[n1][0] + lvect[0] + crad*(t[0] + a[n1]*u[n1][0]),
362 <                        vert[n1][1] + lvect[1] + crad*(t[1] + a[n1]*u[n1][1]),
363 <                        lvect[2] + crad*(t[2] - 1.));
364 <        printf("\t%18.12g\t%18.12g\t%18.12g\n",
365 <                        vert[n1][0] + crad*(t[0] + a[n1]*u[n1][0]),
366 <                        vert[n1][1] + crad*(t[1] + a[n1]*u[n1][1]),
367 <                        crad*(t[2] + 1.));
368 <                                        /* output joining edge */
369 <        if (lvdir*a[n1] < 0.)
370 <                return;
371 <        printf("\n%s cylinder %s.e%d\n", pmtype, pname, n0+1);
372 <        printf("0\n0\n7\n");
373 <        printf("\t%18.12g\t%18.12g\t%18.12g\n",
374 <                vert[n1][0] + crad*(a[n1]*u[n1][0] - u[n1][1]),
375 <                vert[n1][1] + crad*(a[n1]*u[n1][1] + u[n1][0]),
376 <                crad);
377 <        printf("\t%18.12g\t%18.12g\t%18.12g\n",
378 <                vert[n1][0] + lvect[0] + crad*(a[n1]*u[n1][0] - u[n1][1]),
379 <                vert[n1][1] + lvect[1] + crad*(a[n1]*u[n1][1] + u[n1][0]),
380 <                lvect[2] - crad);
381 <        printf("\t%18.12g\n", lvdir*crad);
382 < }
383 <
384 <
290 > static void
291   printhead(ac, av)               /* print command header */
292   register int  ac;
293   register char  **av;
# Line 393 | Line 299 | register char  **av;
299          }
300          putchar('\n');
301   }
302 +
303 +
304 + main(argc, argv)
305 + int  argc;
306 + char  **argv;
307 + {
308 +        int  an;
309 +        
310 +        if (argc < 4)
311 +                goto userr;
312 +
313 +        pmtype = argv[1];
314 +        pname = argv[2];
315 +
316 +        if (!strcmp(argv[3], "-")) {
317 +                readverts(NULL);
318 +                an = 4;
319 +        } else if (isdigit(argv[3][0])) {
320 +                nverts = atoi(argv[3]);
321 +                if (argc-3 < 2*nverts)
322 +                        goto userr;
323 +                for (an = 0; an < nverts; an++) {
324 +                        vert[an][0] = atof(argv[2*an+4]);
325 +                        vert[an][1] = atof(argv[2*an+5]);
326 +                }
327 +                an = 2*nverts+4;
328 +        } else {
329 +                readverts(argv[3]);
330 +                an = 4;
331 +        }
332 +        if (nverts < 3) {
333 +                fprintf(stderr, "%s: not enough vertices\n", argv[0]);
334 +                exit(1);
335 +        }
336 +
337 +        for ( ; an < argc; an++) {
338 +                if (argv[an][0] != '-')
339 +                        goto userr;
340 +                switch (argv[an][1]) {
341 +                case 'l':                               /* length vector */
342 +                        lvect[0] = atof(argv[++an]);
343 +                        lvect[1] = atof(argv[++an]);
344 +                        lvect[2] = atof(argv[++an]);
345 +                        if (lvect[2] < -FTINY)
346 +                                lvdir = -1;
347 +                        else if (lvect[2] > FTINY)
348 +                                lvdir = 1;
349 +                        else {
350 +                                fprintf(stderr,
351 +                                        "%s: illegal extrusion vector\n",
352 +                                                argv[0]);
353 +                                exit(1);
354 +                        }
355 +                        llen = sqrt(lvect[0]*lvect[0] + lvect[1]*lvect[1] +
356 +                                        lvect[2]*lvect[2]);
357 +                        break;
358 +                case 'r':                               /* radius */
359 +                        crad = atof(argv[++an]);
360 +                        break;
361 +                case 'e':                               /* ends */
362 +                        do_ends = !do_ends;
363 +                        break;
364 +                case 'c':                               /* complete */
365 +                        iscomplete = !iscomplete;
366 +                        break;
367 +                default:
368 +                        goto userr;
369 +                }
370 +        }
371 +        if (crad > FTINY) {
372 +                if (crad > lvdir*lvect[2]) {
373 +                        fprintf(stderr, "%s: rounding greater than height\n",
374 +                                        argv[0]);
375 +                        exit(1);
376 +                }
377 +                crad *= lvdir;          /* simplifies formulas */
378 +                compute_rounding();
379 +                printhead(argc, argv);
380 +                if (do_ends)
381 +                        printrends();
382 +                printsides(1);
383 +        } else {
384 +                printhead(argc, argv);
385 +                if (do_ends)
386 +                        printends();
387 +                printsides(0);
388 +        }
389 +        exit(0);
390 + userr:
391 +        fprintf(stderr, "Usage: %s material name ", argv[0]);
392 +        fprintf(stderr, "{ - | vfile | N v1 v2 .. vN } ");
393 +        fprintf(stderr, "[-l lvect][-r radius][-c][-e]\n");
394 +        exit(1);
395 + }
396 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines