98 |
|
src->so = so; |
99 |
|
/* get the face */ |
100 |
|
f = getface(so); |
101 |
< |
if (f->area == 0.0) |
101 |
> |
if (f->area == 0.) |
102 |
|
objerror(so, USER, "zero source area"); |
103 |
|
/* find the center */ |
104 |
|
for (j = 0; j < 3; j++) { |
121 |
|
} |
122 |
|
src->srad = sqrt(src->srad); |
123 |
|
/* compute size vectors */ |
124 |
< |
if (f->nv == 4) /* parallelogram case */ |
124 |
> |
if (f->nv == 4) { /* parallelogram case */ |
125 |
|
for (j = 0; j < 3; j++) { |
126 |
|
src->ss[SU][j] = .5*(VERTEX(f,1)[j]-VERTEX(f,0)[j]); |
127 |
|
src->ss[SV][j] = .5*(VERTEX(f,3)[j]-VERTEX(f,0)[j]); |
128 |
|
} |
129 |
< |
else |
130 |
< |
setflatss(src); |
129 |
> |
} else if (f->nv == 3) { /* triangle case */ |
130 |
> |
int near0 = 2; |
131 |
> |
double dmin = dist2line(src->sloc, VERTEX(f,2), VERTEX(f,0)); |
132 |
> |
for (i = 0; i < 2; i++) { |
133 |
> |
double d2 = dist2line(src->sloc, VERTEX(f,i), VERTEX(f,i+1)); |
134 |
> |
if (d2 >= dmin) |
135 |
> |
continue; |
136 |
> |
near0 = i; |
137 |
> |
dmin = d2; /* radius = min distance */ |
138 |
> |
} |
139 |
> |
if (dmin < .08*f->area) |
140 |
> |
objerror(so, WARNING, "triangular source with poor aspect"); |
141 |
> |
i = (near0 + 1) % 3; |
142 |
> |
for (j = 0; j < 3; j++) |
143 |
> |
src->ss[SU][j] = VERTEX(f,i)[j] - VERTEX(f,near0)[j]; |
144 |
> |
normalize(src->ss[SU]); |
145 |
> |
dmin = sqrt(dmin); |
146 |
> |
for (j = 0; j < 3; j++) |
147 |
> |
src->ss[SU][j] *= dmin; |
148 |
> |
fcross(src->ss[SV], f->norm, src->ss[SU]); |
149 |
> |
} else |
150 |
> |
setflatss(src); /* hope for convex! */ |
151 |
|
} |
152 |
|
|
153 |
|
|
197 |
|
VCOPY(src->sloc, so->oargs.farg); |
198 |
|
src->srad = so->oargs.farg[3]; |
199 |
|
src->ss2 = PI * src->srad * src->srad; |
200 |
+ |
memset(src->ss, 0, sizeof(src->ss)); |
201 |
|
for (i = 0; i < 3; i++) |
181 |
– |
src->ss[SU][i] = src->ss[SV][i] = src->ss[SW][i] = 0.0; |
182 |
– |
for (i = 0; i < 3; i++) |
202 |
|
src->ss[i][i] = 0.7236 * so->oargs.farg[3]; |
203 |
|
} |
204 |
|
|
215 |
|
src->so = so; |
216 |
|
/* get the ring */ |
217 |
|
co = getcone(so, 0); |
218 |
+ |
if (co == NULL) |
219 |
+ |
objerror(so, USER, "illegal source"); |
220 |
|
if (CO_R1(co) <= FTINY) |
221 |
|
objerror(so, USER, "illegal source radius"); |
222 |
|
VCOPY(src->sloc, CO_P0(co)); |
243 |
|
src->so = so; |
244 |
|
/* get the cylinder */ |
245 |
|
co = getcone(so, 0); |
246 |
+ |
if (co == NULL) |
247 |
+ |
objerror(so, USER, "illegal source"); |
248 |
|
if (CO_R0(co) <= FTINY) |
249 |
|
objerror(so, USER, "illegal source radius"); |
250 |
|
if (CO_R0(co) > .2*co->al) /* heuristic constraint */ |
359 |
|
CONE *co; |
360 |
|
|
361 |
|
co = getcone(op, 0); |
362 |
+ |
if (co == NULL) |
363 |
+ |
return(0.); |
364 |
|
VCOPY(ocent, CO_P0(co)); |
365 |
|
return(CO_R1(co)*CO_R1(co)); |
366 |
|
} |
389 |
|
CONE *co; |
390 |
|
|
391 |
|
co = getcone(op, 0); |
392 |
+ |
if (co == NULL) { |
393 |
+ |
memset(nvec, 0, sizeof(FVECT)); |
394 |
+ |
return(0.); |
395 |
+ |
} |
396 |
|
VCOPY(nvec, co->ad); |
397 |
|
return(DOT(nvec, CO_P0(co))); |
398 |
|
} |