225 |
|
static float * |
226 |
|
getambdiffs(AMBHEMI *hp) |
227 |
|
{ |
228 |
< |
float *earr = (float *)malloc(sizeof(float)*hp->ns*hp->ns); |
228 |
> |
float *earr = (float *)calloc(hp->ns*hp->ns, sizeof(float)); |
229 |
|
float *ep; |
230 |
|
AMBSAMP *ap; |
231 |
|
double b, d2; |
236 |
|
/* compute squared neighbor diffs */ |
237 |
|
for (ap = hp->sa, ep = earr, i = 0; i < hp->ns; i++) |
238 |
|
for (j = 0; j < hp->ns; j++, ap++, ep++) { |
239 |
– |
ep[0] = FTINY; |
239 |
|
b = bright(ap[0].v); |
240 |
|
if (i) { /* from above */ |
241 |
|
d2 = b - bright(ap[-hp->ns].v); |
243 |
|
ep[0] += d2; |
244 |
|
ep[-hp->ns] += d2; |
245 |
|
} |
246 |
< |
if (j) { /* from behind */ |
247 |
< |
d2 = b - bright(ap[-1].v); |
248 |
< |
d2 *= d2; |
249 |
< |
ep[0] += d2; |
250 |
< |
ep[-1] += d2; |
251 |
< |
} |
246 |
> |
if (!j) continue; |
247 |
> |
/* from behind */ |
248 |
> |
d2 = b - bright(ap[-1].v); |
249 |
> |
d2 *= d2; |
250 |
> |
ep[0] += d2; |
251 |
> |
ep[-1] += d2; |
252 |
> |
if (!i) continue; |
253 |
> |
/* diagonal */ |
254 |
> |
d2 = b - bright(ap[-hp->ns-1].v); |
255 |
> |
d2 *= d2; |
256 |
> |
ep[0] += d2; |
257 |
> |
ep[-hp->ns-1] += d2; |
258 |
|
} |
259 |
|
/* correct for number of neighbors */ |
260 |
< |
earr[0] *= 2.f; |
261 |
< |
earr[hp->ns-1] *= 2.f; |
262 |
< |
earr[(hp->ns-1)*hp->ns] *= 2.f; |
263 |
< |
earr[(hp->ns-1)*hp->ns + hp->ns-1] *= 2.f; |
260 |
> |
earr[0] *= 8./3.; |
261 |
> |
earr[hp->ns-1] *= 8./3.; |
262 |
> |
earr[(hp->ns-1)*hp->ns] *= 8./3.; |
263 |
> |
earr[(hp->ns-1)*hp->ns + hp->ns-1] *= 8./3.; |
264 |
|
for (i = 1; i < hp->ns-1; i++) { |
265 |
< |
earr[i*hp->ns] *= 4./3.; |
266 |
< |
earr[i*hp->ns + hp->ns-1] *= 4./3.; |
265 |
> |
earr[i*hp->ns] *= 8./5.; |
266 |
> |
earr[i*hp->ns + hp->ns-1] *= 8./5.; |
267 |
|
} |
268 |
|
for (j = 1; j < hp->ns-1; j++) { |
269 |
< |
earr[j] *= 4./3.; |
270 |
< |
earr[(hp->ns-1)*hp->ns + j] *= 4./3.; |
269 |
> |
earr[j] *= 8./5.; |
270 |
> |
earr[(hp->ns-1)*hp->ns + j] *= 8./5.; |
271 |
|
} |
272 |
|
return(earr); |
273 |
|
} |
283 |
|
RAY ar; |
284 |
|
double asum[3]; |
285 |
|
float *ep; |
286 |
< |
int i, j, n; |
286 |
> |
int i, j, n, nss; |
287 |
|
|
288 |
|
if (earr == NULL) /* just skip calc. if no memory */ |
289 |
|
return; |
290 |
|
/* accumulate estimated variances */ |
291 |
< |
for (ep = earr + hp->ns*hp->ns; ep-- > earr; ) |
292 |
< |
e2rem += *ep; |
291 |
> |
for (ep = earr + hp->ns*hp->ns; ep > earr; ) |
292 |
> |
e2rem += *--ep; |
293 |
|
ep = earr; /* perform super-sampling */ |
294 |
|
for (ap = hp->sa, i = 0; i < hp->ns; i++) |
295 |
|
for (j = 0; j < hp->ns; j++, ap++) { |
296 |
< |
int nss = *ep/e2rem*cnt + frandom(); |
296 |
> |
if (e2rem <= FTINY) |
297 |
> |
goto done; /* nothing left to do */ |
298 |
> |
nss = *ep/e2rem*cnt + frandom(); |
299 |
|
asum[0] = asum[1] = asum[2] = 0.0; |
300 |
|
for (n = 1; n <= nss; n++) { |
301 |
|
if (!getambsamp(&ar, hp, i, j, n)) { |
313 |
|
e2rem -= *ep++; /* update remainders */ |
314 |
|
cnt -= nss; |
315 |
|
} |
316 |
+ |
done: |
317 |
|
free(earr); |
318 |
|
} |
319 |
|
|