ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/genprism.c
Revision: 2.2
Committed: Thu Dec 19 15:08:51 1991 UTC (32 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.1: +4 -1 lines
Log Message:
removed atof declaration for NeXT

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1987 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * genprism.c - generate a prism.
9     * 2D vertices in the xy plane are given on the
10     * command line or from a file. Their order together
11     * with the extrude direction will determine surface
12     * orientation.
13     *
14     * 8/24/87
15     */
16    
17     #include <stdio.h>
18    
19     #include <ctype.h>
20    
21     #define MAXVERT 1024 /* maximum # vertices */
22    
23 greg 2.2 #ifndef atof
24     extern double atof();
25     #endif
26    
27 greg 1.1 char *pmtype; /* material type */
28     char *pname; /* name */
29    
30     double lvect[3] = {0.0, 0.0, 1.0};
31    
32     double vert[MAXVERT][2];
33     int nverts = 0;
34    
35     int do_ends = 1; /* include end caps */
36     int iscomplete = 0; /* polygon is already completed */
37    
38    
39     main(argc, argv)
40     int argc;
41     char **argv;
42     {
43     int an;
44    
45     if (argc < 4)
46     goto userr;
47    
48     pmtype = argv[1];
49     pname = argv[2];
50    
51     if (!strcmp(argv[3], "-")) {
52     readverts(NULL);
53     an = 4;
54     } else if (isdigit(argv[3][0])) {
55     nverts = atoi(argv[3]);
56     if (argc-3 < 2*nverts)
57     goto userr;
58     for (an = 0; an < nverts; an++) {
59     vert[an][0] = atof(argv[2*an+4]);
60     vert[an][1] = atof(argv[2*an+5]);
61     }
62     an = 2*nverts+4;
63     } else {
64     readverts(argv[3]);
65     an = 4;
66     }
67     if (nverts < 3) {
68     fprintf(stderr, "%s: not enough vertices\n", argv[0]);
69     exit(1);
70     }
71    
72     for ( ; an < argc; an++) {
73     if (argv[an][0] != '-')
74     goto userr;
75     switch (argv[an][1]) {
76     case 'l': /* length vector */
77     lvect[0] = atof(argv[++an]);
78     lvect[1] = atof(argv[++an]);
79     lvect[2] = atof(argv[++an]);
80     break;
81     case 'e': /* ends */
82     do_ends = !do_ends;
83     break;
84     case 'c': /* complete */
85     iscomplete = !iscomplete;
86     break;
87     default:
88     goto userr;
89     }
90     }
91    
92     printhead(argc, argv);
93    
94     if (do_ends)
95     printends();
96     printsides();
97    
98     return(0);
99     userr:
100     fprintf(stderr, "Usage: %s material name ", argv[0]);
101     fprintf(stderr, "{ - | vfile | N v1 v2 .. vN } ");
102     fprintf(stderr, "[-l lvect][-c][-e]\n");
103     exit(1);
104     }
105    
106    
107     readverts(fname) /* read vertices from a file */
108 greg 1.2 char *fname;
109 greg 1.1 {
110     FILE *fp;
111    
112     if (fname == NULL)
113     fp = stdin;
114     else if ((fp = fopen(fname, "r")) == NULL) {
115     fprintf(stderr, "%s: cannot open\n", fname);
116     exit(1);
117     }
118     while (fscanf(fp, "%lf %lf", &vert[nverts][0], &vert[nverts][1]) == 2)
119     nverts++;
120     fclose(fp);
121     }
122    
123    
124     printends() /* print ends of prism */
125     {
126     register int i;
127    
128     printf("\n%s polygon %s.b\n", pmtype, pname);
129     printf("0\n0\n%d\n", nverts*3);
130     for (i = 0; i < nverts; i++) {
131     printf("\t%18.12g\t%18.12g\t%18.12g\n",
132     vert[i][0],
133     vert[i][1],
134     0.0);
135     }
136     printf("\n%s polygon %s.e\n", pmtype, pname);
137     printf("0\n0\n%d\n", nverts*3);
138     for (i = nverts-1; i >= 0; i--) {
139     printf("\t%18.12g\t%18.12g\t%18.12g\n",
140     vert[i][0]+lvect[0],
141     vert[i][1]+lvect[1],
142     lvect[2]);
143     }
144     }
145    
146    
147     printsides() /* print prism sides */
148     {
149     register int i;
150    
151     for (i = 0; i < nverts-1; i++)
152     side(i, i+1);
153     if (!iscomplete)
154     side(nverts-1, 0);
155     }
156    
157    
158     side(n1, n2) /* print single side */
159     register int n1, n2;
160     {
161     printf("\n%s polygon %s.%d\n", pmtype, pname, n1+1);
162     printf("0\n0\n12\n");
163     printf("\t%18.12g\t%18.12g\t%18.12g\n",
164     vert[n1][0],
165     vert[n1][1],
166     0.0);
167     printf("\t%18.12g\t%18.12g\t%18.12g\n",
168     vert[n1][0]+lvect[0],
169     vert[n1][1]+lvect[1],
170     lvect[2]);
171     printf("\t%18.12g\t%18.12g\t%18.12g\n",
172     vert[n2][0]+lvect[0],
173     vert[n2][1]+lvect[1],
174     lvect[2]);
175     printf("\t%18.12g\t%18.12g\t%18.12g\n",
176     vert[n2][0],
177     vert[n2][1],
178     0.0);
179     }
180    
181    
182     printhead(ac, av) /* print command header */
183     register int ac;
184     register char **av;
185     {
186     putchar('#');
187     while (ac--) {
188     putchar(' ');
189     fputs(*av++, stdout);
190     }
191     putchar('\n');
192     }