ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/gensurf.c
Revision: 1.2
Committed: Sun Sep 10 16:45:16 1989 UTC (34 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.1: +3 -1 lines
Log Message:
fixed location of SCCSid

File Contents

# Content
1 /* Copyright (c) 1989 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * gensurf.c - program to generate functional surfaces
9 *
10 * Parametric functions x(s,t), y(s,t) and z(s,t)
11 * specify the surface, which is tesselated into an m by n
12 * array of paired triangles.
13 * The surface normal is defined by the right hand
14 * rule applied to (s,t).
15 *
16 * 4/3/87
17 */
18
19 #include <stdio.h>
20
21 #define XNAME "X_" /* x function name */
22 #define YNAME "Y_" /* y function name */
23 #define ZNAME "Z_" /* z function name */
24
25 #define PI 3.14159265358979323846
26
27 #define FTINY 1e-7
28
29 #define vertex(p) printf(vformat, (p)[0], (p)[1], (p)[2])
30
31 char vformat[] = "%15.9g %15.9g %15.9g\n";
32
33 double funvalue(), dist2(), fdot(), l_hermite(), argument();
34
35
36 main(argc, argv)
37 int argc;
38 char *argv[];
39 {
40 static double *xyz[4];
41 double *row0, *row1, *dp;
42 double v1[3], v2[3], vc1[3], vc2[3];
43 double a1, a2;
44 int i, j, m, n;
45 char stmp[256];
46 double d;
47 register int k;
48
49 varset("PI", PI);
50 funset("hermite", 5, l_hermite);
51
52 if (argc < 8)
53 goto userror;
54
55 for (i = 8; i < argc; i++)
56 if (!strcmp(argv[i], "-e"))
57 scompile(NULL, argv[++i]);
58 else if (!strcmp(argv[i], "-f"))
59 fcompile(argv[++i]);
60 else
61 goto userror;
62
63 sprintf(stmp, "%s(s,t)=%s;", XNAME, argv[3]);
64 scompile(NULL, stmp);
65 sprintf(stmp, "%s(s,t)=%s;", YNAME, argv[4]);
66 scompile(NULL, stmp);
67 sprintf(stmp, "%s(s,t)=%s;", ZNAME, argv[5]);
68 scompile(NULL, stmp);
69 m = atoi(argv[6]);
70 n = atoi(argv[7]);
71 if (m <= 0 || n <= 0)
72 goto userror;
73
74 row0 = (double *)malloc((n+1)*3*sizeof(double));
75 row1 = (double *)malloc((n+1)*3*sizeof(double));
76 if (row0 == NULL || row1 == NULL) {
77 fprintf(stderr, "%s: out of memory\n", argv[0]);
78 quit(1);
79 }
80
81 printhead(argc, argv);
82
83 comprow(0.0, row1, n); /* compute zeroeth row */
84
85 for (i = 0; i < m; i++) {
86 /* compute next row */
87 dp = row0;
88 row0 = row1;
89 row1 = dp;
90 comprow((double)(i+1)/m, row1, n);
91
92 for (j = 0; j < n; j++) {
93 /* get vertices */
94 xyz[0] = row0 + 3*j;
95 xyz[1] = row1 + 3*j;
96 xyz[2] = xyz[0] + 3;
97 xyz[3] = xyz[1] + 3;
98 /* rotate vertices */
99 if (dist2(xyz[0],xyz[3]) < dist2(xyz[1],xyz[2])-FTINY) {
100 dp = xyz[0];
101 xyz[0] = xyz[1];
102 xyz[1] = xyz[3];
103 xyz[3] = xyz[2];
104 xyz[2] = dp;
105 }
106 /* get normals */
107 for (k = 0; k < 3; k++) {
108 v1[k] = xyz[1][k] - xyz[0][k];
109 v2[k] = xyz[2][k] - xyz[0][k];
110 }
111 fcross(vc1, v1, v2);
112 a1 = fdot(vc1, vc1);
113 for (k = 0; k < 3; k++) {
114 v1[k] = xyz[2][k] - xyz[3][k];
115 v2[k] = xyz[1][k] - xyz[3][k];
116 }
117 fcross(vc2, v1, v2);
118 a2 = fdot(vc2, vc2);
119 /* check coplanar */
120 if (a1 > FTINY*FTINY && a2 > FTINY*FTINY) {
121 d = fdot(vc1, vc2);
122 if (d*d/a1/a2 >= 1.0-FTINY*FTINY) {
123 if (d > 0.0) { /* coplanar */
124 printf(
125 "\n%s polygon %s.%d.%d\n",
126 argv[1], argv[2], i+1, j+1);
127 printf("0\n0\n12\n");
128 vertex(xyz[0]);
129 vertex(xyz[1]);
130 vertex(xyz[3]);
131 vertex(xyz[2]);
132 } /* else overlapped */
133 continue;
134 } /* else bent */
135 }
136 /* check triangles */
137 if (a1 > FTINY*FTINY) {
138 printf("\n%s polygon %s.%da%d\n",
139 argv[1], argv[2], i+1, j+1);
140 printf("0\n0\n9\n");
141 vertex(xyz[0]);
142 vertex(xyz[1]);
143 vertex(xyz[2]);
144 }
145 if (a2 > FTINY*FTINY) {
146 printf("\n%s polygon %s.%db%d\n",
147 argv[1], argv[2], i+1, j+1);
148 printf("0\n0\n9\n");
149 vertex(xyz[2]);
150 vertex(xyz[1]);
151 vertex(xyz[3]);
152 }
153 }
154 }
155
156 quit(0);
157
158 userror:
159 fprintf(stderr, "Usage: %s material name ", argv[0]);
160 fprintf(stderr, "x(s,t) y(s,t) z(s,t) m n [-e expr] [-f file]\n");
161 quit(1);
162 }
163
164
165 comprow(s, row, siz) /* compute row of values */
166 double s;
167 register double *row;
168 int siz;
169 {
170 double st[2], step;
171
172 st[0] = s;
173 st[1] = 0.0;
174 step = 1.0 / siz;
175 while (siz-- >= 0) {
176 *row++ = funvalue(XNAME, 2, st);
177 *row++ = funvalue(YNAME, 2, st);
178 *row++ = funvalue(ZNAME, 2, st);
179 st[1] += step;
180 }
181 }
182
183
184 eputs(msg)
185 char *msg;
186 {
187 fputs(msg, stderr);
188 }
189
190
191 wputs(msg)
192 char *msg;
193 {
194 eputs(msg);
195 }
196
197
198 quit(code)
199 {
200 exit(code);
201 }
202
203
204 printhead(ac, av) /* print command header */
205 register int ac;
206 register char **av;
207 {
208 putchar('#');
209 while (ac--) {
210 putchar(' ');
211 fputs(*av++, stdout);
212 }
213 putchar('\n');
214 }
215
216
217 double
218 l_hermite()
219 {
220 double t;
221
222 t = argument(5);
223 return( argument(1)*((2.0*t-3.0)*t*t+1.0) +
224 argument(2)*(-2.0*t+3.0)*t*t +
225 argument(3)*((t-2.0)*t+1.0)*t +
226 argument(4)*(t-1.0)*t*t );
227 }