111 |
|
} |
112 |
|
} else { /* local source */ |
113 |
|
multp3(nsloc, sp->sloc, pm); |
114 |
– |
if (sp->sflags & SPROX) { |
115 |
– |
d2 = 0.; |
116 |
– |
for (i = 0; i < 3; i++) { |
117 |
– |
d1 = ocent[i] - nsloc[i]; |
118 |
– |
d2 += d1*d1; |
119 |
– |
} |
120 |
– |
if (d2 > sp->sl.prox*sp->sl.prox) |
121 |
– |
return(NULL); /* too far away */ |
122 |
– |
} |
114 |
|
for (i = 0; i < 3; i++) |
115 |
|
ourspot.aim[i] = ocent[i] - nsloc[i]; |
116 |
|
if ((d1 = normalize(ourspot.aim)) == 0.) |
117 |
|
return(NULL); /* at source!! */ |
118 |
+ |
if (sp->sflags & SPROX && d1 > sp->sl.prox) |
119 |
+ |
return(NULL); /* too far away */ |
120 |
|
ourspot.siz = 2.*PI*(1. - d1/sqrt(d1*d1+maxrad2)); |
121 |
|
ourspot.flen = 0.; |
122 |
|
if (sp->sflags & SSPOT) { |
157 |
|
FVECT org; |
158 |
|
{ |
159 |
|
FVECT cent; |
160 |
< |
double rad2, d1r2, d2r2; |
160 |
> |
double rad2, cos1, cos2; |
161 |
|
|
162 |
< |
d1r2 = 1. - sp1->siz/(2.*PI); |
163 |
< |
d2r2 = 1. - sp2->siz/(2.*PI); |
162 |
> |
cos1 = 1. - sp1->siz/(2.*PI); |
163 |
> |
cos2 = 1. - sp2->siz/(2.*PI); |
164 |
|
if (sp2->siz >= 2.*PI-FTINY) /* BIG, just check overlap */ |
165 |
< |
return(DOT(sp1->aim,sp2->aim) >= d1r2*d2r2 - |
166 |
< |
sqrt((1.-d1r2*d1r2)*(1.-d2r2*d2r2))); |
165 |
> |
return(DOT(sp1->aim,sp2->aim) >= cos1*cos2 - |
166 |
> |
sqrt((1.-cos1*cos1)*(1.-cos2*cos2))); |
167 |
|
/* compute and check disks */ |
168 |
< |
d1r2 = 1./(d1r2*d1r2) - 1.; |
169 |
< |
d2r2 = 1./(d2r2*d2r2) - 1.; |
177 |
< |
rad2 = intercircle(cent, sp1->aim, sp2->aim, d1r2, d2r2); |
168 |
> |
rad2 = intercircle(cent, sp1->aim, sp2->aim, |
169 |
> |
1./(cos1*cos1) - 1., 1./(cos2*cos2) - 1.); |
170 |
|
if (rad2 <= FTINY || normalize(cent) == 0.) |
171 |
|
return(0); |
172 |
|
VCOPY(sp1->aim, cent); |
185 |
|
/* move centers to common plane */ |
186 |
|
d = DOT(sp1->aim, dir); |
187 |
|
for (i = 0; i < 3; i++) |
188 |
< |
c1[i] = sp2->aim[i] - d*dir[i]; |
188 |
> |
c1[i] = sp1->aim[i] - d*dir[i]; |
189 |
|
d = DOT(sp2->aim, dir); |
190 |
|
for (i = 0; i < 3; i++) |
191 |
|
c2[i] = sp2->aim[i] - d*dir[i]; |
259 |
|
/* no overlap? */ |
260 |
|
if (a2 <= 0.) |
261 |
|
return(0.); |
262 |
+ |
/* overlap, compute center */ |
263 |
|
l = sqrt((r1s - a2)/d2); |
264 |
|
for (i = 0; i < 3; i++) |
265 |
|
cc[i] = c1[i] + l*disp[i]; |
282 |
|
switch (op->otype) { |
283 |
|
case OBJ_FACE: |
284 |
|
{ |
285 |
< |
double d1, d2; |
285 |
> |
double d2; |
286 |
|
register int i, j; |
287 |
|
register FACE *f = getface(op); |
288 |
|
|
294 |
|
} |
295 |
|
maxrad2 = 0.; |
296 |
|
for (j = 0; j < f->nv; j++) { |
297 |
< |
d2 = 0.; |
305 |
< |
for (i = 0; i < 3; i++) { |
306 |
< |
d1 = VERTEX(f,j)[i] - ocent[i]; |
307 |
< |
d2 += d1*d1; |
308 |
< |
} |
297 |
> |
d2 = dist2(VERTEX(f,j), ocent); |
298 |
|
if (d2 > maxrad2) |
299 |
|
maxrad2 = d2; |
300 |
|
} |