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 |
< |
for (i = 0; i < 3; i++) |
181 |
< |
src->ss[SU][i] = src->ss[SV][i] = src->ss[SW][i] = 0.0; |
200 |
> |
memset(src->ss, 0, sizeof(src->ss)); |
201 |
|
for (i = 0; i < 3; i++) |
202 |
|
src->ss[i][i] = 0.7236 * so->oargs.farg[3]; |
203 |
|
} |