| 1 |
|
#ifndef lint |
| 2 |
< |
static const char RCSid[] = "$Id$"; |
| 2 |
> |
static const char RCSid[] = "$Id$"; |
| 3 |
|
#endif |
| 4 |
< |
/* EVALGLARE V2.06 |
| 5 |
< |
* Evalglare Software License, Version 2.0 |
| 4 |
> |
/* EVALGLARE V3.05 |
| 5 |
> |
* Evalglare Software License, Version 3.0x |
| 6 |
|
* |
| 7 |
< |
* Copyright (c) 1995 - 2016 Fraunhofer ISE, EPFL. |
| 7 |
> |
* Copyright (c) 1995 - 2022 Fraunhofer ISE, EPFL. |
| 8 |
|
* All rights reserved. |
| 9 |
|
* |
| 10 |
|
* |
| 334 |
|
change of default value of multiplier b to 5.0, if task options (-t or -T ) are activated AND -b NOT used. To be downward compatible when using the task method. |
| 335 |
|
*/ |
| 336 |
|
|
| 337 |
< |
|
| 337 |
> |
/* evalglare.c, v2.07 2018/11/17 |
| 338 |
> |
bugfix: correction of error in the equations of PGSV_con and PGSV_sat |
| 339 |
> |
all three PGSV equations are calculated now |
| 340 |
> |
illuminance from the masking area (E_v_mask) is also printed |
| 341 |
> |
bugfix: in VCPs error fuction equation, value of 6.347 replaced by 6.374 |
| 342 |
> |
*/ |
| 343 |
> |
|
| 344 |
> |
/* evalglare.c, v2.08 2018/11/27 |
| 345 |
> |
bugfix: checkroutine for same image size for the masking corrected |
| 346 |
> |
*/ |
| 347 |
> |
|
| 348 |
> |
/* evalglare.c, v2.09 2019/01/18 |
| 349 |
> |
calculate "illuminance-contribution of zones" |
| 350 |
> |
-switch to turn off low-light correction: 4 |
| 351 |
> |
*/ |
| 352 |
> |
|
| 353 |
> |
/* evalglare.c, v2.10 2019/07/30, 2020/06/25 |
| 354 |
> |
-add multiimage-mode for annual glare evaluation -Q |
| 355 |
> |
-extra output for multiimage mode |
| 356 |
> |
2020/06/22 - added Ev contribution from each glare source as output to the multiimage mode |
| 357 |
> |
-switch for correction modes (-C), value of 0 switches off all corrections |
| 358 |
> |
*/ |
| 359 |
> |
|
| 360 |
> |
|
| 361 |
> |
/* evalglare.c, v2.11 2020/07/06 |
| 362 |
> |
-add extra output for DGP-contribution in -d mode |
| 363 |
> |
-fix (remove) 1 pixel offset of the mulltiimage-mode |
| 364 |
> |
*/ |
| 365 |
> |
|
| 366 |
> |
/* evalglare.c, v2.12 2021/07/19 |
| 367 |
> |
-bugfix: center of glare source calculation now based on l*omega weighting, before it was just on omega. |
| 368 |
> |
*/ |
| 369 |
> |
|
| 370 |
> |
/* evalglare.c, v2.13 2021/07/21 |
| 371 |
> |
- center of glare source calculation now based on l*l*omega weighting. |
| 372 |
> |
- bugfix: Position-index below line of sight is now corrected and based on the modified equation from Iwata and Osterhaus 2010 |
| 373 |
> |
*/ |
| 374 |
> |
|
| 375 |
> |
/* evalglare.c, v2.14 2021/10/20 |
| 376 |
> |
- center of glare source calculation now based on l*omega weighting. |
| 377 |
> |
- adding UGP2 equation to the output |
| 378 |
> |
- new default setting: low-light correction off ! |
| 379 |
> |
*/ |
| 380 |
> |
|
| 381 |
> |
/* evalglare.c, v3.0 2021/12/24 |
| 382 |
> |
- adding patch-mode (-z patchangle combineflag ) as glare source grouping method |
| 383 |
> |
*/ |
| 384 |
> |
|
| 385 |
> |
/* evalglare.c, v3.01 2022/01/05 |
| 386 |
> |
- change of multi-image-mode. Adding extra scans with scaled image |
| 387 |
> |
syntax now: -Q n_images n_extrascans_per_image n_images*( imagename x y n_extrascans*(scale) ) |
| 388 |
> |
*/ |
| 389 |
> |
/* evalglare.c, v3.02 2022/02/11 |
| 390 |
> |
- correction of position index below line of sight after Takuro Kikuchi's comments in radiance-discourse from Dec 2021. |
| 391 |
> |
*/ |
| 392 |
> |
|
| 393 |
> |
/* evalglare.c, v3.03 2022/03/18, 2024/06/25 |
| 394 |
> |
- add no pixels output for zonal analysis. |
| 395 |
> |
|
| 396 |
> |
/* evalglare.c, v3.04 2023/09/01 |
| 397 |
> |
- test version to include peripherical dependency, changes not (yet) used for following versions |
| 398 |
> |
|
| 399 |
> |
/* evalglare.c, v3.05 2024/06/25 |
| 400 |
> |
- fix bug of still having lowlight correction even if turned off |
| 401 |
> |
- changing abs_max,Lveil from float to double |
| 402 |
> |
*/ |
| 403 |
> |
|
| 404 |
> |
|
| 405 |
|
#define EVALGLARE |
| 406 |
|
#define PROGNAME "evalglare" |
| 407 |
< |
#define VERSION "2.06 release 29.08.2018 by EPFL, J.Wienold" |
| 407 |
> |
#define VERSION "3.05 release 25.06.2024 by J.Wienold, EPFL" |
| 408 |
|
#define RELEASENAME PROGNAME " " VERSION |
| 409 |
|
|
| 410 |
|
|
| 421 |
|
void add_pixel_to_gs(pict * p, int x, int y, int gsn) |
| 422 |
|
{ |
| 423 |
|
double old_av_posx, old_av_posy, old_av_lum, old_omega, act_omega, |
| 424 |
< |
new_omega, act_lum; |
| 424 |
> |
new_omega, act_lum,temp_av_posx,temp_av_posy,av_lum; |
| 425 |
|
|
| 426 |
|
|
| 427 |
|
pict_get_npix(p, gsn) = pict_get_npix(p, gsn) + 1; |
| 433 |
|
act_omega = pict_get_omega(p, x, y); |
| 434 |
|
act_lum = luminance(pict_get_color(p, x, y)); |
| 435 |
|
new_omega = old_omega + act_omega; |
| 436 |
< |
pict_get_av_posx(p, gsn) = |
| 437 |
< |
(old_av_posx * old_omega + x * act_omega) / new_omega; |
| 438 |
< |
pict_get_av_posy(p, gsn) = |
| 439 |
< |
(old_av_posy * old_omega + y * act_omega) / new_omega; |
| 436 |
> |
pict_get_av_lum(p, gsn) = |
| 437 |
> |
(old_av_lum * old_omega + act_lum * act_omega) / new_omega; |
| 438 |
> |
|
| 439 |
> |
av_lum=pict_get_av_lum(p, gsn); |
| 440 |
> |
temp_av_posx = |
| 441 |
> |
(old_av_posx * old_omega* old_av_lum + x * act_omega*act_lum) / (old_av_lum*old_omega + act_lum* act_omega ); |
| 442 |
> |
pict_get_av_posx(p, gsn) = temp_av_posx; |
| 443 |
> |
temp_av_posy = |
| 444 |
> |
(old_av_posy * old_omega* old_av_lum + y * act_omega*act_lum) / (old_av_lum*old_omega + act_lum* act_omega ); |
| 445 |
> |
|
| 446 |
> |
pict_get_av_posy(p, gsn) = temp_av_posy; |
| 447 |
|
if (isnan((pict_get_av_posx(p, gsn)))) |
| 448 |
|
fprintf(stderr,"error in add_pixel_to_gs %d %d %f %f %f %f\n", x, y, old_av_posy, old_omega, act_omega, new_omega); |
| 449 |
|
|
| 376 |
– |
pict_get_av_lum(p, gsn) = |
| 377 |
– |
(old_av_lum * old_omega + act_lum * act_omega) / new_omega; |
| 450 |
|
pict_get_av_omega(p, gsn) = new_omega; |
| 451 |
|
pict_get_gsn(p, x, y) = gsn; |
| 452 |
|
if (act_lum < pict_get_lum_min(p, gsn)) { |
| 820 |
|
void split_pixel_from_gs(pict * p, int x, int y, int new_gsn, int uniform_gs, double u_r, double u_g , double u_b) |
| 821 |
|
{ |
| 822 |
|
int old_gsn, icol; |
| 823 |
< |
double old_av_posx, old_av_posy, old_av_lum, old_omega, act_omega, |
| 824 |
< |
new_omega, act_lum; |
| 823 |
> |
double old_av_posx, old_av_posy, old_av_lum, old_omega, act_omega, delta_E, |
| 824 |
> |
new_omega, act_lum,temp_av_posx,temp_av_posy,av_lum; |
| 825 |
|
|
| 826 |
|
|
| 827 |
|
/* change existing gs */ |
| 832 |
|
old_av_posx = pict_get_av_posx(p, old_gsn); |
| 833 |
|
old_av_posy = pict_get_av_posy(p, old_gsn); |
| 834 |
|
old_omega = pict_get_av_omega(p, old_gsn); |
| 835 |
+ |
|
| 836 |
+ |
|
| 837 |
+ |
|
| 838 |
|
|
| 839 |
|
new_omega = old_omega - act_omega; |
| 840 |
|
pict_get_av_omega(p, old_gsn) = new_omega; |
| 766 |
– |
pict_get_av_posx(p, old_gsn) = |
| 767 |
– |
(old_av_posx * old_omega - x * act_omega) / new_omega; |
| 768 |
– |
pict_get_av_posy(p, old_gsn) = |
| 769 |
– |
(old_av_posy * old_omega - y * act_omega) / new_omega; |
| 841 |
|
|
| 771 |
– |
|
| 842 |
|
act_lum = luminance(pict_get_color(p, x, y)); |
| 843 |
|
old_av_lum = pict_get_av_lum(p, old_gsn); |
| 844 |
|
pict_get_av_lum(p, old_gsn) = |
| 845 |
|
(old_av_lum * old_omega - act_lum * act_omega) / new_omega; |
| 846 |
+ |
|
| 847 |
+ |
av_lum = pict_get_av_lum(p, old_gsn); |
| 848 |
+ |
temp_av_posx = |
| 849 |
+ |
(old_av_posx *old_av_lum* old_omega - x *act_lum* act_omega ) / (old_av_lum*old_omega - act_lum* act_omega); |
| 850 |
+ |
|
| 851 |
+ |
pict_get_av_posx(p, old_gsn) = temp_av_posx; |
| 852 |
+ |
temp_av_posy = |
| 853 |
+ |
(old_av_posy *old_av_lum* old_omega - y *act_lum* act_omega ) / (old_av_lum*old_omega - act_lum* act_omega); |
| 854 |
+ |
pict_get_av_posy(p, old_gsn) = temp_av_posy; |
| 855 |
+ |
|
| 856 |
|
/* add pixel to new gs */ |
| 857 |
|
|
| 858 |
|
add_pixel_to_gs(p, x, y, new_gsn); |
| 859 |
|
|
| 860 |
+ |
|
| 861 |
+ |
|
| 862 |
+ |
|
| 863 |
|
/* color pixel of new gs */ |
| 864 |
|
|
| 865 |
|
/* icol = setglcolor(p, x, y, new_gsn, uniform_gs, u_r, u_g , u_b); */ |
| 871 |
|
float get_posindex(pict * p, float x, float y, int postype) |
| 872 |
|
{ |
| 873 |
|
float posindex; |
| 874 |
< |
double teta, phi, sigma, tau, deg, d, s, r, fact; |
| 874 |
> |
double teta, beta, phi, sigma, tau, deg, d, s, r, fact; |
| 875 |
|
|
| 876 |
|
|
| 877 |
|
pict_get_vangle(p, x, y, p->view.vdir, p->view.vup, &phi); |
| 899 |
|
/* KIM model */ |
| 900 |
|
posindex = exp ((sigma-(-0.000009*tau*tau*tau+0.0014*tau*tau+0.0866*tau+21.633))/(-0.000009*tau*tau*tau+0.0013*tau*tau+0.0853*tau+8.772)); |
| 901 |
|
}else{ |
| 902 |
+ |
|
| 903 |
|
/* Guth model, equation from IES lighting handbook */ |
| 904 |
|
posindex = |
| 905 |
|
exp((35.2 - 0.31889 * tau - |
| 908 |
|
0.002963 * tau * |
| 909 |
|
tau) / 100000 * |
| 910 |
|
sigma * sigma); |
| 827 |
– |
/* below line of sight, using Iwata model */ |
| 828 |
– |
if (phi < 0) { |
| 829 |
– |
d = 1 / tan(phi); |
| 830 |
– |
s = tan(teta) / tan(phi); |
| 831 |
– |
r = sqrt(1 / d * 1 / d + s * s / d / d); |
| 832 |
– |
if (r > 0.6) |
| 833 |
– |
fact = 1.2; |
| 834 |
– |
if (r > 3) { |
| 835 |
– |
fact = 1.2; |
| 836 |
– |
r = 3; |
| 837 |
– |
} |
| 911 |
|
|
| 912 |
< |
posindex = 1 + fact * r; |
| 912 |
> |
/* below line of sight, using Iwata model, CIE2010, converted coordinate system according to Takuro Kikuchi */ |
| 913 |
> |
|
| 914 |
> |
if (phi < 0) { |
| 915 |
> |
beta = atan(tan(sigma/deg)* sqrt(1 + 0.3225 * pow(cos(tau/deg),2))) * deg; |
| 916 |
> |
posindex = exp(6.49 / 1000 * beta + 21.0 / 100000 * beta * beta); |
| 917 |
> |
|
| 918 |
|
} |
| 919 |
+ |
|
| 920 |
|
if (posindex > 16) |
| 921 |
|
posindex = 16; |
| 922 |
|
} |
| 1210 |
|
pict_get_av_posy(p, i), |
| 1211 |
|
posindex_2), |
| 1212 |
|
a4) * pow(pict_get_av_omega(p, i), a2); |
| 1213 |
< |
/* printf("i,sum_glare %i %f\n",i,sum_glare);*/ |
| 1213 |
> |
/*printf("i,sum_glare %i %f\n",i,sum_glare); */ |
| 1214 |
|
} |
| 1215 |
|
} |
| 1216 |
|
dgp = |
| 1268 |
|
{ |
| 1269 |
|
float vcp; |
| 1270 |
|
|
| 1271 |
< |
vcp = 50 * erf((6.347 - 1.3227 * log(dgr)) / 1.414213562373) + 50; |
| 1271 |
> |
vcp = 50 * erf((6.374 - 1.3227 * log(dgr)) / 1.414213562373) + 50; |
| 1272 |
|
if (dgr > 750) { |
| 1273 |
|
vcp = 0; |
| 1274 |
|
} |
| 1364 |
|
return ugp; |
| 1365 |
|
|
| 1366 |
|
} |
| 1367 |
+ |
/* subroutine for the calculation of the updated unified glare probability (Hirning 2016)*/ |
| 1368 |
+ |
float get_ugp2(pict * p, double lum_backg, int igs, int posindex_2) |
| 1369 |
+ |
{ |
| 1370 |
+ |
float ugp; |
| 1371 |
+ |
double sum_glare,ugp2; |
| 1372 |
+ |
int i, i_glare; |
| 1373 |
|
|
| 1374 |
|
|
| 1375 |
+ |
sum_glare = 0; |
| 1376 |
+ |
i_glare = 0; |
| 1377 |
+ |
for (i = 0; i <= igs; i++) { |
| 1378 |
+ |
|
| 1379 |
+ |
if (pict_get_npix(p, i) > 0) { |
| 1380 |
+ |
i_glare = i_glare + 1; |
| 1381 |
+ |
sum_glare += |
| 1382 |
+ |
pow(pict_get_av_lum(p, i) / |
| 1383 |
+ |
get_posindex(p, pict_get_av_posx(p, i), |
| 1384 |
+ |
pict_get_av_posy(p, i), posindex_2), |
| 1385 |
+ |
2) * pict_get_av_omega(p, i); |
| 1386 |
+ |
|
| 1387 |
+ |
} |
| 1388 |
+ |
} |
| 1389 |
+ |
ugp2 = 1/pow(1.0+2.0/7.0*pow(sum_glare/lum_backg,-0.2),10.0); |
| 1390 |
+ |
|
| 1391 |
+ |
return ugp2; |
| 1392 |
+ |
|
| 1393 |
+ |
} |
| 1394 |
+ |
|
| 1395 |
+ |
|
| 1396 |
|
/* subroutine for the calculation of the disability glare according to Poynter */ |
| 1397 |
|
float get_disability(pict * p, double lum_backg, int igs) |
| 1398 |
|
{ |
| 1466 |
|
return cgi; |
| 1467 |
|
} |
| 1468 |
|
|
| 1469 |
< |
/* subroutine for the calculation of the PGSV; is only applied, when masking is done, since it refers only to the window. Important: masking area must be the window! */ |
| 1470 |
< |
float get_pgsv(double E_v, double E_mask,double omega_mask,double lum_mask_av) |
| 1469 |
> |
|
| 1470 |
> |
|
| 1471 |
> |
/* subroutine for the calculation of the PGSV_con; is only applied, when masking is done, since it refers only to the window. Important: masking area must be the window! */ |
| 1472 |
> |
float get_pgsv_con(double E_v, double E_mask,double omega_mask,double lum_mask_av, double Lavg) |
| 1473 |
|
{ |
| 1474 |
< |
float pgsv; |
| 1474 |
> |
float pgsv_con; |
| 1475 |
|
double Lb; |
| 1476 |
|
|
| 1477 |
< |
Lb = (E_v-E_mask)/1.414213562373; |
| 1477 |
> |
/* Lb = (E_v-E_mask)/3.14159265359; */ |
| 1478 |
> |
/* Lb = (2*E_v-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); */ |
| 1479 |
> |
Lb = (2*3.14159265359*Lavg-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); |
| 1480 |
|
|
| 1371 |
– |
pgsv =3.2*log10(lum_mask_av)-0.64*log10(omega_mask)+(0.79*log10(omega_mask)-0.61)*log10(Lb)-8.2 ; |
| 1481 |
|
|
| 1482 |
+ |
pgsv_con =3.2*log10(lum_mask_av)-0.64*log10(omega_mask)+(0.79*log10(omega_mask)-0.61)*log10(Lb)-8.2 ; |
| 1483 |
|
|
| 1484 |
< |
return pgsv; |
| 1484 |
> |
|
| 1485 |
> |
return pgsv_con; |
| 1486 |
|
} |
| 1487 |
|
|
| 1488 |
|
/* subroutine for the calculation of the PGSV_saturation; is only applied, when masking is done, since it refers only to the window. Important: masking area must be the window! */ |
| 1490 |
|
{ |
| 1491 |
|
float pgsv_sat; |
| 1492 |
|
|
| 1493 |
< |
pgsv_sat =3.3-(0.57+3.3)/pow((1+E_v/1.414213562373/1250),1.7); |
| 1493 |
> |
pgsv_sat =3.3-(0.57+3.3)/(1+pow(E_v/3.14159265359/1250,1.7)); |
| 1494 |
|
|
| 1495 |
|
|
| 1496 |
|
return pgsv_sat; |
| 1497 |
|
} |
| 1498 |
|
|
| 1499 |
+ |
/* subroutine for the calculation of the PGSV; is only applied, when masking is done, since it refers only to the window. Important: masking area must be the window! */ |
| 1500 |
|
|
| 1501 |
+ |
float get_pgsv(double E_v, double E_mask,double omega_mask,double lum_mask_av,double Ltask, double Lavg) |
| 1502 |
+ |
{ |
| 1503 |
+ |
float pgsv; |
| 1504 |
+ |
double Lb; |
| 1505 |
|
|
| 1506 |
+ |
/* Lb = (E_v-E_mask)/3.14159265359; */ |
| 1507 |
+ |
/* Lb = (2*E_v-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); */ |
| 1508 |
+ |
Lb = (2*3.14159265359*Lavg-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); |
| 1509 |
+ |
|
| 1510 |
+ |
if (Lb==0.0 ) { |
| 1511 |
+ |
fprintf(stderr, " warning: Background luminance is 0 or masking area = full image! pgsv cannot be calculated (set to -99)!!\n"); |
| 1512 |
+ |
pgsv=-99; |
| 1513 |
+ |
}else{ |
| 1514 |
+ |
if ( (lum_mask_av/Lb) > (E_v/(3.14159265359*Ltask))) { |
| 1515 |
+ |
pgsv=get_pgsv_con(E_v,E_mask,omega_mask,lum_mask_av, Lavg); |
| 1516 |
+ |
}else{ |
| 1517 |
+ |
pgsv=get_pgsv_sat(E_v) ; |
| 1518 |
+ |
}} |
| 1519 |
+ |
return pgsv; |
| 1520 |
|
|
| 1521 |
+ |
} |
| 1522 |
+ |
|
| 1523 |
+ |
|
| 1524 |
+ |
|
| 1525 |
|
#ifdef EVALGLARE |
| 1526 |
|
|
| 1527 |
|
|
| 1531 |
|
|
| 1532 |
|
int main(int argc, char **argv) |
| 1533 |
|
{ |
| 1534 |
< |
#define CLINEMAX 4095 /* memory allocated for command line string */ |
| 1534 |
> |
#define CLINEMAX 999999999 /* memory allocated for command line string */ |
| 1535 |
|
pict *p = pict_create(); |
| 1536 |
|
pict *pm = pict_create(); |
| 1537 |
< |
int skip_second_scan,calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin, |
| 1538 |
< |
ext_vill, set_lum_max, set_lum_max2, img_corr,x_disk,y_disk,task_color, i_splitstart,zones,act_gsn,splitgs, |
| 1539 |
< |
i_split, posindex_2, task_lum, checkfile, rval, i, i_max, x, y,x2,y2,x_zone,y_zone, i_z1, i_z2, thres_activate, |
| 1537 |
> |
pict *pcoeff = pict_create(); |
| 1538 |
> |
int add,i1,i2,y_lines,ix_offset,x_offset,y_offset, patchmode,ix, iy, patch_pixdistance_x, patch_pixdistance_y,nx_patch,ny_patch, lowlight,skip_second_scan, |
| 1539 |
> |
calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin, |
| 1540 |
> |
ext_vill, set_lum_max, set_lum_max2, img_corr,x_disk,y_disk,task_color, i_splitstart,zones,act_gsn,splitgs,j,jj,multi_image_mode, |
| 1541 |
> |
i_split, posindex_2, task_lum, checkfile, rval, i, i_max, x, y,x2,y2,x_zone,y_zone, i_z1, i_z2, thres_activate,num_images,xmap,ymap, |
| 1542 |
|
igs, actual_igs, lastpixelwas_gs, icol, xt, yt, change,checkpixels, before_igs, sgs, splithigh,uniform_gs,x_max, y_max,y_mid, |
| 1543 |
< |
detail_out, posindex_picture, non_cos_lb, rx, ry, rmx,rmy,apply_disability,band_calc,band_color,masking,i_mask,no_glaresources,force; |
| 1544 |
< |
double LUM_replace,lum_total_max,age_corr_factor,age,dgp_ext,dgp,low_light_corr,omega_cos_contr, setvalue, lum_ideal, E_v_contr, sigma,om,delta_E, |
| 1545 |
< |
E_vl_ext, lum_max, new_lum_max, r_center, ugp, ugr_exp, dgi_mod,lum_a, pgsv,E_v_mask,pgsv_sat,angle_disk,dist,n_corner_px,zero_corner_px, |
| 1543 |
> |
detail_out, posindex_picture, non_cos_lb, rx, ry,lastpixelwas_peak, rmx,rmy,apply_disability,band_calc,band_color,masking,i_mask,no_glaresources,force,num_scans; |
| 1544 |
> |
double abs_max,Lveil,xxx,angle_v,angle_h,patch_angle, r_contrast,r_dgp,r_glare,sum_glare, LUM_replace,lum_total_max,age_corr_factor,age,dgp_ext,dgp,low_light_corr,omega_cos_contr, setvalue, |
| 1545 |
> |
lum_ideal, E_v_contr, sigma,om,delta_E, |
| 1546 |
> |
E_vl_ext, lum_max, new_lum_max, r_center, ugp,ugp2, ugr_exp, dgi_mod,lum_a, E_v_mask,angle_disk,dist,n_corner_px,zero_corner_px, |
| 1547 |
|
search_pix, a1, a2, a3, a4, a5, c3, c1, c2, r_split, max_angle,r_actual,lum_actual,dir_ill, |
| 1548 |
< |
omegat, sang, E_v, E_v2, E_v_dir, avlum, act_lum, ang, angle_z1, angle_z2,per_95_band,per_75_band,pos, |
| 1548 |
> |
omegat, sang,Ez1,Ez2, E_v, E_v2, E_v_dir, avlum, act_lum, ang, angle_z1, angle_z2,per_95_band,per_75_band,pos, |
| 1549 |
|
l_max, lum_backg, lum_backg_cos, omega_sources, lum_sources,per_75_mask,per_95_mask,per_75_z1,per_95_z1,per_75_z2,per_95_z2, |
| 1550 |
|
lum, lum_source,teta,Lveil_cie,Lveil_cie_sum,disability_thresh,u_r,u_g,u_b,band_angle,band_avlum, |
| 1551 |
|
lum_mask[1],lum_mask_av,lum_mask_std[1],lum_mask_median[1],omega_mask,bbox[2], |
| 1553 |
|
lum_z1[1],lum_z1_av,lum_z1_std[1],lum_z1_median[1],omega_z1,bbox_z1[2], |
| 1554 |
|
lum_z2[1],lum_z2_av,lum_z2_std[1],lum_z2_median[1],omega_z2,bbox_z2[2], |
| 1555 |
|
lum_pos[1],lum_nopos_median[1],lum_pos_median[1],lum_pos2_median[1],lum_pos_mean,lum_pos2_mean; |
| 1556 |
< |
float lum_task, lum_thres, dgi, vcp, cgi, ugr, limit, dgr, |
| 1557 |
< |
abs_max, Lveil; |
| 1421 |
< |
char maskfile[500],file_out[500], file_out2[500], version[500]; |
| 1556 |
> |
float lum_task, lum_thres, dgi, vcp, cgi, ugr, limit, dgr,pgsv ,pgsv_sat,pgsv_con; |
| 1557 |
> |
char maskfile[500],file_out[500], file_out2[500], version[500],correction_type[500]; |
| 1558 |
|
char *cline; |
| 1559 |
+ |
char** temp_image_name; |
| 1560 |
+ |
int *x_temp_img, *y_temp_img; |
| 1561 |
+ |
double *scale_image_scans; |
| 1562 |
|
VIEW userview = STDVIEW; |
| 1563 |
|
int gotuserview = 0; |
| 1564 |
+ |
|
| 1565 |
|
struct muc_rvar* s_mask; |
| 1566 |
|
s_mask = muc_rvar_create(); |
| 1567 |
|
muc_rvar_set_dim(s_mask, 1); |
| 1596 |
|
muc_rvar_clear(s_posweight2); |
| 1597 |
|
|
| 1598 |
|
/*set required user view parameters to invalid values*/ |
| 1599 |
< |
dir_ill=0.0; |
| 1599 |
> |
patchmode=0; |
| 1600 |
> |
patch_angle=25.0; |
| 1601 |
> |
patch_pixdistance_x=0; |
| 1602 |
> |
patch_pixdistance_y=0; |
| 1603 |
> |
lowlight=0; |
| 1604 |
> |
multi_image_mode=0; |
| 1605 |
> |
lastpixelwas_peak=0; |
| 1606 |
> |
num_images=0; |
| 1607 |
> |
dir_ill=0.0; |
| 1608 |
|
delta_E=0.0; |
| 1609 |
|
no_glaresources=0; |
| 1610 |
|
n_corner_px=0; |
| 1626 |
|
lum_band_av = 0.0; |
| 1627 |
|
omega_band = 0.0; |
| 1628 |
|
pgsv = 0.0 ; |
| 1629 |
+ |
pgsv_con = 0.0 ; |
| 1630 |
|
pgsv_sat = 0.0 ; |
| 1631 |
|
E_v_mask = 0.0; |
| 1632 |
+ |
Ez1 = 0.0; |
| 1633 |
+ |
Ez2 = 0.0; |
| 1634 |
|
lum_z1_av = 0.0; |
| 1635 |
|
omega_z1 = 0.0; |
| 1636 |
|
lum_z2_av = 0.0; |
| 1671 |
|
lum_ideal = 0.0; |
| 1672 |
|
max_angle = 0.2; |
| 1673 |
|
lum_thres = 2000.0; |
| 1674 |
+ |
lum_task = 0.0; |
| 1675 |
|
task_lum = 0; |
| 1676 |
|
sgs = 0; |
| 1677 |
|
splithigh = 1; |
| 1697 |
|
set_lum_max2 = 0; |
| 1698 |
|
img_corr=0; |
| 1699 |
|
abs_max = 0; |
| 1700 |
< |
progname = argv[0]; |
| 1700 |
> |
fixargv0(argv[0]); |
| 1701 |
|
E_v_contr = 0.0; |
| 1702 |
< |
strcpy(version, "1.19 release 09.12.2015 by J.Wienold"); |
| 1702 |
> |
strcpy(version, "3.05 release 25.06.2024 by J.Wienold"); |
| 1703 |
|
low_light_corr=1.0; |
| 1704 |
|
output = 0; |
| 1705 |
|
calc_vill = 0; |
| 1715 |
|
thres_activate=0; |
| 1716 |
|
/* command line for output picture*/ |
| 1717 |
|
|
| 1718 |
< |
cline = (char *) malloc(CLINEMAX+1); |
| 1718 |
> |
cline = (char *) malloc(CLINEMAX+100); |
| 1719 |
|
cline[0] = '\0'; |
| 1720 |
|
for (i = 0; i < argc; i++) { |
| 1721 |
|
/* fprintf(stderr, "%d %d \n",i,strlen(argv[i]));*/ |
| 1763 |
|
break; |
| 1764 |
|
case 'b': |
| 1765 |
|
lum_thres = atof(argv[++i]); |
| 1766 |
+ |
lum_source =lum_thres; |
| 1767 |
|
thres_activate = 1; |
| 1768 |
|
break; |
| 1769 |
|
case 'c': |
| 1779 |
|
case 'r': |
| 1780 |
|
max_angle = atof(argv[++i]); |
| 1781 |
|
break; |
| 1782 |
+ |
case 'z': |
| 1783 |
+ |
patch_angle = atof(argv[++i]); |
| 1784 |
+ |
patchmode= atoi(argv[++i]); |
| 1785 |
+ |
if ( patchmode == 3) { output=4;} |
| 1786 |
+ |
|
| 1787 |
+ |
/* patchmode = 0 : deactivated; patchmode =1: patch without combining, normal output; patchmode =3: patch without combining, coefficient output; patchmode =2 patch with combining (not yet implemented...) */ |
| 1788 |
+ |
break; |
| 1789 |
+ |
|
| 1790 |
|
case 's': |
| 1791 |
|
sgs = 1; |
| 1792 |
|
break; |
| 1944 |
|
/*case 'v': |
| 1945 |
|
printf("evalglare %s \n",version); |
| 1946 |
|
exit(1); */ |
| 1947 |
+ |
case 'C': |
| 1948 |
+ |
strcpy(correction_type,argv[++i]); |
| 1949 |
+ |
|
| 1950 |
+ |
if (!strcmp(correction_type,"l-") ){ |
| 1951 |
+ |
/* printf("low light off!\n"); */ |
| 1952 |
+ |
lowlight = 0; } |
| 1953 |
+ |
if (!strcmp(correction_type,"l+") ){ |
| 1954 |
+ |
/* printf("low light on!\n"); */ |
| 1955 |
+ |
lowlight = 1; } |
| 1956 |
+ |
if (!strcmp(correction_type,"0") ){ |
| 1957 |
+ |
/* printf("all corrections off!\n"); */ |
| 1958 |
+ |
lowlight = 0; } |
| 1959 |
+ |
|
| 1960 |
+ |
break; |
| 1961 |
|
|
| 1962 |
+ |
/*case 'v': |
| 1963 |
+ |
printf("evalglare %s \n",version); |
| 1964 |
+ |
exit(1); */ |
| 1965 |
+ |
|
| 1966 |
|
case '1': |
| 1967 |
|
output = 1; |
| 1968 |
|
break; |
| 1970 |
|
output = 2; |
| 1971 |
|
dir_ill = atof(argv[++i]); |
| 1972 |
|
break; |
| 1973 |
< |
|
| 1973 |
> |
case '3': |
| 1974 |
> |
output = 3; |
| 1975 |
> |
break; |
| 1976 |
> |
case '4': |
| 1977 |
> |
lowlight = 0; |
| 1978 |
> |
break; |
| 1979 |
> |
case 'Q': |
| 1980 |
> |
multi_image_mode=1; |
| 1981 |
> |
output= 3; |
| 1982 |
> |
calcfast=1; |
| 1983 |
> |
num_images =atoi(argv[++i]); |
| 1984 |
> |
num_scans =atoi(argv[++i]); |
| 1985 |
> |
temp_image_name = malloc(sizeof(char*)*num_images); |
| 1986 |
> |
|
| 1987 |
> |
x_temp_img=(int *) malloc(sizeof(int) * num_images); |
| 1988 |
> |
y_temp_img=(int *) malloc(sizeof(int) * num_images); |
| 1989 |
> |
scale_image_scans=(double *) malloc(sizeof(double) * (num_scans+1)*num_images); |
| 1990 |
> |
/* iterate through all images and allocate 256 characters to each: */ |
| 1991 |
> |
for (j = 0; j < num_images; j++) { |
| 1992 |
> |
scale_image_scans[j*(num_scans+1)]=1.0; |
| 1993 |
> |
temp_image_name[j] = malloc(256*sizeof(char)); |
| 1994 |
> |
strcpy(temp_image_name[j], argv[++i]); |
| 1995 |
> |
x_temp_img[j] = atoi(argv[++i]); |
| 1996 |
> |
y_temp_img[j] = atoi(argv[++i]); |
| 1997 |
> |
for (jj=1;jj<=num_scans;jj++){ |
| 1998 |
> |
scale_image_scans[j*(num_scans+1)+jj]=atof(argv[++i]);} |
| 1999 |
> |
} |
| 2000 |
> |
|
| 2001 |
> |
|
| 2002 |
> |
break; |
| 2003 |
|
case 'v': |
| 2004 |
|
if (argv[i][2] == '\0') { |
| 2005 |
|
printf("%s \n",RELEASENAME); |
| 2029 |
|
} |
| 2030 |
|
|
| 2031 |
|
/* set multiplier for task method to 5, if not specified */ |
| 2032 |
+ |
|
| 2033 |
|
|
| 2034 |
+ |
|
| 2035 |
|
if ( task_lum == 1 && thres_activate == 0){ |
| 2036 |
|
lum_thres = 5.0; |
| 2037 |
|
} |
| 2099 |
|
exit(1); |
| 2100 |
|
} |
| 2101 |
|
|
| 2102 |
+ |
if ( patchmode > 0 && p->view.type != VT_ANG) { |
| 2103 |
+ |
|
| 2104 |
+ |
fprintf(stderr, "error: Patchmode only possible with view type vta ! Stopping... \n"); |
| 2105 |
+ |
exit(1); |
| 2106 |
+ |
|
| 2107 |
+ |
} |
| 2108 |
+ |
|
| 2109 |
+ |
|
| 2110 |
|
if (p->view.type == VT_PER) { |
| 2111 |
|
fprintf(stderr, "warning: image has perspective view type specified in header ! \n"); |
| 2112 |
|
} |
| 2113 |
|
|
| 2114 |
|
if (masking == 1) { |
| 2115 |
|
|
| 2116 |
< |
if (!pict_get_xsize(p)==pict_get_xsize(pm) || !pict_get_ysize(p)==pict_get_ysize(pm)) { |
| 2116 |
> |
if (pict_get_xsize(p)!=pict_get_xsize(pm) || pict_get_ysize(p)!=pict_get_ysize(pm)) { |
| 2117 |
|
fprintf(stderr, "error: masking image has other resolution than main image ! \n"); |
| 2118 |
|
fprintf(stderr, "size must be identical \n"); |
| 2119 |
|
printf("resolution main image : %dx%d\n",pict_get_xsize(p),pict_get_ysize(p)); |
| 2148 |
|
|
| 2149 |
|
} |
| 2150 |
|
} |
| 2151 |
< |
|
| 2151 |
> |
|
| 2152 |
> |
|
| 2153 |
|
/* Check task position */ |
| 2154 |
|
|
| 2155 |
|
if (task_lum == 1) { |
| 2173 |
|
pict_get_z1_gsn(p,igs) = 0; |
| 2174 |
|
pict_get_z2_gsn(p,igs) = 0; |
| 2175 |
|
|
| 2176 |
+ |
if (multi_image_mode<1) { |
| 2177 |
|
|
| 2178 |
+ |
|
| 2179 |
|
/* cut out GUTH field of view and exit without glare evaluation */ |
| 2180 |
|
if (cut_view==2) { |
| 2181 |
|
if (cut_view_type==1) { |
| 2463 |
|
/* printf("Ev, avlum, Omega_tot%f %f %f \n",E_v, avlum, sang); */ |
| 2464 |
|
|
| 2465 |
|
/* first glare source scan: find primary glare sources */ |
| 2466 |
+ |
|
| 2467 |
+ |
if (patchmode==0) { |
| 2468 |
|
for (x = 0; x < pict_get_xsize(p); x++) { |
| 2469 |
< |
/* lastpixelwas_gs=0; */ |
| 2469 |
> |
lastpixelwas_gs=0; |
| 2470 |
> |
/* lastpixelwas_peak=0; */ |
| 2471 |
|
for (y = 0; y < pict_get_ysize(p); y++) { |
| 2472 |
|
if (pict_get_hangle(p, x, y, p->view.vdir, p->view.vup, &ang)) { |
| 2473 |
|
if (pict_is_validpixel(p, x, y)) { |
| 2477 |
|
lum_total_max=act_lum; |
| 2478 |
|
} |
| 2479 |
|
/* speed improvement first scan: when last pixel was glare source, then use this glare source number instead of searching. |
| 2480 |
< |
has been deactivated with v1.25 |
| 2480 |
> |
has been deactivated with v1.25, reactivated with v2.10 */ |
| 2481 |
|
|
| 2482 |
< |
if (lastpixelwas_gs==0 || search_pix <= 1.0 ) { */ |
| 2482 |
> |
if (lastpixelwas_gs==0 || search_pix <= 1.0 ) { |
| 2483 |
|
actual_igs = find_near_pgs(p, x, y, max_angle, 0, igs, 1); |
| 2484 |
< |
/* }*/ |
| 2484 |
> |
} |
| 2485 |
|
if (actual_igs == 0) { |
| 2486 |
|
igs = igs + 1; |
| 2487 |
|
pict_new_gli(p); |
| 2497 |
|
pict_get_gsn(p, x, y) = actual_igs; |
| 2498 |
|
pict_get_pgs(p, x, y) = 1; |
| 2499 |
|
add_pixel_to_gs(p, x, y, actual_igs); |
| 2500 |
< |
/* lastpixelwas_gs=actual_igs; */ |
| 2500 |
> |
lastpixelwas_gs=actual_igs; |
| 2501 |
|
|
| 2502 |
|
} else { |
| 2503 |
|
pict_get_pgs(p, x, y) = 0; |
| 2504 |
< |
/* lastpixelwas_gs=0;*/ |
| 2504 |
> |
lastpixelwas_gs=0; |
| 2505 |
|
} |
| 2506 |
|
} |
| 2507 |
|
} |
| 2508 |
|
} |
| 2509 |
|
} |
| 2510 |
< |
/* pict_write(p,"firstscan.pic"); */ |
| 2510 |
> |
} else { |
| 2511 |
> |
/* patchmode on! |
| 2512 |
> |
calculation only for angular projection! |
| 2513 |
|
|
| 2514 |
+ |
*/ |
| 2515 |
|
|
| 2516 |
|
|
| 2517 |
+ |
angle_v=p->view.vert; |
| 2518 |
+ |
angle_h=p->view.horiz; |
| 2519 |
|
|
| 2520 |
< |
if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2 ) { |
| 2520 |
> |
|
| 2521 |
> |
/*printf ("angle_v,angle_h: %f %f \n",angle_v,angle_h) ; |
| 2522 |
> |
|
| 2523 |
> |
setting up patches as glare sources */ |
| 2524 |
> |
|
| 2525 |
> |
patch_pixdistance_x=floor(pict_get_xsize(p)/angle_h*patch_angle); |
| 2526 |
> |
patch_pixdistance_y=floor(pict_get_ysize(p)/angle_v*patch_angle); |
| 2527 |
> |
|
| 2528 |
> |
nx_patch=floor(angle_v/patch_angle)+1; |
| 2529 |
> |
ny_patch=floor(angle_h/patch_angle)+1; |
| 2530 |
> |
|
| 2531 |
> |
y_offset=floor (patch_pixdistance_y/2); |
| 2532 |
> |
x_offset=floor (patch_pixdistance_x/2); |
| 2533 |
> |
/* printf ("nx_patch,ny_patch,x_offset,y_offset,patch_pixdistance_x,patch_pixdistance_y %i %i %i %i %i %i\n",nx_patch,ny_patch,x_offset,y_offset,patch_pixdistance_x,patch_pixdistance_y) ; */ |
| 2534 |
> |
|
| 2535 |
> |
ix_offset=0; |
| 2536 |
> |
for (iy=1; iy<=ny_patch;iy++) { |
| 2537 |
> |
|
| 2538 |
> |
|
| 2539 |
> |
|
| 2540 |
> |
for (ix=1; ix<=nx_patch;ix++) { |
| 2541 |
> |
igs = igs + 1; |
| 2542 |
> |
pict_new_gli(p); |
| 2543 |
> |
|
| 2544 |
> |
pict_get_lum_min(p, igs) = HUGE_VAL; |
| 2545 |
> |
pict_get_Eglare(p,igs) = 0.0; |
| 2546 |
> |
pict_get_Dglare(p,igs) = 0.0; |
| 2547 |
> |
pict_get_z1_gsn(p,igs) = 0; |
| 2548 |
> |
pict_get_z2_gsn(p,igs) = 0; |
| 2549 |
> |
pict_get_dx_max(p,igs) = (x_offset+ix_offset*x_offset+(ix-1)*patch_pixdistance_x)*1.0; |
| 2550 |
> |
pict_get_dy_max(p,igs) = (y_offset+(iy-1)*patch_pixdistance_y)*1.0; |
| 2551 |
> |
|
| 2552 |
> |
/* printf ("igs, x-patch, y-patch : %i %f %f \n",igs,pict_get_dx_max(p,igs),pict_get_dy_max(p,igs) ) ; */ |
| 2553 |
> |
|
| 2554 |
> |
} |
| 2555 |
> |
ix_offset=ix_offset+1; |
| 2556 |
> |
if (ix_offset==2) { |
| 2557 |
> |
ix_offset =0 ; |
| 2558 |
> |
} |
| 2559 |
> |
|
| 2560 |
> |
} |
| 2561 |
> |
for (y = 0; y < pict_get_ysize(p); y++) { |
| 2562 |
> |
for (x = 0; x < pict_get_xsize(p); x++) { |
| 2563 |
> |
|
| 2564 |
> |
if (pict_get_hangle(p, x, y, p->view.vdir, p->view.vup, &ang)) { |
| 2565 |
> |
if (pict_is_validpixel(p, x, y)) { |
| 2566 |
> |
act_lum = luminance(pict_get_color(p, x, y)); |
| 2567 |
> |
if (act_lum > lum_source) { |
| 2568 |
> |
if (act_lum >lum_total_max) { |
| 2569 |
> |
lum_total_max=act_lum; |
| 2570 |
> |
} |
| 2571 |
> |
|
| 2572 |
> |
y_lines = floor((y)/patch_pixdistance_y); |
| 2573 |
> |
xxx = (x+0.0)/(patch_pixdistance_x+0.0)-0.5*(y_lines % 2); |
| 2574 |
> |
if (xxx<0 ) { xxx=0.0 ;} |
| 2575 |
> |
i1 = y_lines*(nx_patch)+floor(xxx)+1; |
| 2576 |
> |
i2=0; |
| 2577 |
> |
add=0; |
| 2578 |
> |
if (y_lines % 2 == 1 ) {add=1;} |
| 2579 |
> |
|
| 2580 |
> |
if (y >pict_get_dy_max(p,i1)) { |
| 2581 |
> |
|
| 2582 |
> |
if (x > pict_get_dx_max(p,i1)) { |
| 2583 |
> |
i2=i1+nx_patch+add; |
| 2584 |
> |
}else { |
| 2585 |
> |
i2=i1+nx_patch-1+add; |
| 2586 |
> |
} |
| 2587 |
> |
}else { |
| 2588 |
> |
|
| 2589 |
> |
if (x > pict_get_dx_max(p,i1)) { |
| 2590 |
> |
i2=i1-nx_patch+add; |
| 2591 |
> |
}else { |
| 2592 |
> |
i2=i1-nx_patch-1+add; |
| 2593 |
> |
} |
| 2594 |
> |
} |
| 2595 |
> |
|
| 2596 |
> |
|
| 2597 |
> |
|
| 2598 |
> |
|
| 2599 |
> |
if (i2 > igs || i2 < 1) {actual_igs=i1;}else{ |
| 2600 |
> |
if ( ((x-pict_get_dx_max(p,i1))*(x-pict_get_dx_max(p,i1))+(y-pict_get_dy_max(p,i1))*(y-pict_get_dy_max(p,i1))) < ((x-pict_get_dx_max(p,i2))*(x-pict_get_dx_max(p,i2))+(y-pict_get_dy_max(p,i2))*(y-pict_get_dy_max(p,i2))) ) { |
| 2601 |
> |
actual_igs=i1; }else {actual_igs=i2;}} |
| 2602 |
> |
|
| 2603 |
> |
|
| 2604 |
> |
pict_get_gsn(p, x, y) = actual_igs; |
| 2605 |
> |
pict_get_pgs(p, x, y) = 1; |
| 2606 |
> |
add_pixel_to_gs(p, x, y, actual_igs); |
| 2607 |
> |
/* setglcolor(p, x, y, actual_igs, uniform_gs, u_r, u_g , u_b); */ |
| 2608 |
> |
} |
| 2609 |
> |
} |
| 2610 |
> |
} |
| 2611 |
> |
|
| 2612 |
> |
|
| 2613 |
> |
|
| 2614 |
> |
|
| 2615 |
> |
|
| 2616 |
> |
} } |
| 2617 |
> |
|
| 2618 |
> |
|
| 2619 |
> |
|
| 2620 |
> |
|
| 2621 |
> |
} |
| 2622 |
> |
/* pict_write(p,"firstscan.pic"); */ |
| 2623 |
> |
|
| 2624 |
> |
|
| 2625 |
> |
|
| 2626 |
> |
|
| 2627 |
> |
if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2 || patchmode > 0) { |
| 2628 |
|
skip_second_scan=1; |
| 2629 |
|
} |
| 2630 |
|
|
| 2708 |
|
|
| 2709 |
|
/* extract extremes from glare sources to extra glare source */ |
| 2710 |
|
if (splithigh == 1 && lum_total_max>limit) { |
| 2711 |
+ |
/* fprintf(stderr, " split of glare source!\n"); */ |
| 2712 |
|
|
| 2713 |
|
r_split = max_angle / 2.0; |
| 2714 |
|
for (i = 0; i <= i_max; i++) { |
| 2868 |
|
i=0; |
| 2869 |
|
for (x = 0; x <= igs; x++) { |
| 2870 |
|
if (pict_get_npix(p, x) > 0) { |
| 2871 |
+ |
sum_glare += pow(pict_get_av_lum(p, x),2.0)* pict_get_av_omega(p, x)/pow(get_posindex(p, pict_get_av_posx(p, x), pict_get_av_posy(p, x),posindex_2), 2.0); |
| 2872 |
|
lum_sources += pict_get_av_lum(p, x) * pict_get_av_omega(p, x); |
| 2873 |
|
omega_sources += pict_get_av_omega(p, x); |
| 2874 |
|
i=i+1; |
| 2875 |
|
}} |
| 2876 |
< |
|
| 2876 |
> |
sum_glare= c2*log10(1 + sum_glare / pow(E_v, a3)); |
| 2877 |
|
if (sang == omega_sources) { |
| 2878 |
|
lum_backg =avlum; |
| 2879 |
|
} else { |
| 2948 |
|
muc_rvar_get_median(s_mask,lum_mask_median); |
| 2949 |
|
muc_rvar_get_bounding_box(s_mask,bbox); |
| 2950 |
|
/* PSGV only why masking of window is applied! */ |
| 2951 |
< |
pgsv = get_pgsv(E_v, E_v_mask, omega_mask, lum_mask_av); |
| 2951 |
> |
|
| 2952 |
> |
|
| 2953 |
> |
if (task_lum == 0 || lum_task == 0.0 ) { |
| 2954 |
> |
fprintf(stderr, " warning: Task area not set or task luminance=0 ! pgsv cannot be calculated (set to -99)!!\n"); |
| 2955 |
> |
pgsv = -99; |
| 2956 |
> |
} else { |
| 2957 |
> |
pgsv = get_pgsv(E_v, E_v_mask, omega_mask, lum_mask_av,lum_task,avlum); |
| 2958 |
> |
} |
| 2959 |
> |
|
| 2960 |
> |
pgsv_con = get_pgsv_con(E_v, E_v_mask, omega_mask, lum_mask_av,avlum); |
| 2961 |
|
pgsv_sat =get_pgsv_sat(E_v); |
| 2962 |
|
|
| 2963 |
|
if (detail_out == 1) { |
| 2964 |
|
|
| 2965 |
< |
printf ("masking:no_pixels,omega,av_lum,median_lum,std_lum,perc_75,perc_95,lum_min,lum_max,pgsv,pgsv_sat: %i %f %f %f %f %f %f %f %f %f %f\n",i_mask,omega_mask,lum_mask_av,lum_mask_median[0],sqrt(lum_mask_std[0]),per_75_mask,per_95_mask,bbox[0],bbox[1],pgsv,pgsv_sat ); |
| 2965 |
> |
printf ("masking:no_pixels,omega,av_lum,median_lum,std_lum,perc_75,perc_95,lum_min,lum_max,pgsv_con,pgsv_sat,pgsv,Ev_mask: %i %f %f %f %f %f %f %f %f %f %f %f %f\n",i_mask,omega_mask,lum_mask_av,lum_mask_median[0],sqrt(lum_mask_std[0]),per_75_mask,per_95_mask,bbox[0],bbox[1],pgsv_con,pgsv_sat,pgsv,E_v_mask ); |
| 2966 |
|
|
| 2967 |
|
} |
| 2968 |
|
|
| 2990 |
|
muc_rvar_add_sample(s_z1, lum_z1); |
| 2991 |
|
omega_z1 += pict_get_omega(p, x, y); |
| 2992 |
|
lum_z1_av += pict_get_omega(p, x, y)* lum_actual; |
| 2993 |
+ |
Ez1 += DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* lum_actual; |
| 2994 |
|
setglcolor(p,x,y,1,1 , 0.66, 0.01 ,0.33); |
| 2995 |
|
/*check if separation gsn already exist */ |
| 2996 |
|
|
| 3007 |
|
splitgs=(int)(pict_get_z1_gsn(p,act_gsn)); |
| 3008 |
|
/* printf("splitgs%i \n",splitgs); */ |
| 3009 |
|
split_pixel_from_gs(p, x, y, splitgs, uniform_gs, u_r, u_g , u_b); |
| 3010 |
+ |
/* move direct illuminance contribution into zone -value */ |
| 3011 |
+ |
delta_E=DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* luminance(pict_get_color(p, x, y)); |
| 3012 |
+ |
pict_get_Eglare(p,act_gsn ) = pict_get_Eglare(p,act_gsn ) - delta_E; |
| 3013 |
+ |
pict_get_Eglare(p,igs ) = pict_get_Eglare(p,igs ) + delta_E; |
| 3014 |
+ |
|
| 3015 |
+ |
|
| 3016 |
|
} |
| 3017 |
|
} |
| 3018 |
|
/*zone2 */ |
| 3024 |
|
muc_rvar_add_sample(s_z2, lum_z2); |
| 3025 |
|
omega_z2 += pict_get_omega(p, x, y); |
| 3026 |
|
lum_z2_av += pict_get_omega(p, x, y)* lum_actual; |
| 3027 |
+ |
Ez2 += DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* lum_actual; |
| 3028 |
|
setglcolor(p,x,y,1,1 , 0.65, 0.33 ,0.02); |
| 3029 |
|
/* printf("zone 2 x y act_gsn pict_get_z1_gsn(p,act_gsn) pict_get_z2_gsn(p,act_gsn): %i %i %f 1:%f 2:%f \n",x,y,act_gsn,pict_get_z1_gsn(p,act_gsn),pict_get_z2_gsn(p,act_gsn)); |
| 3030 |
|
*/ if (act_gsn > 0){ |
| 3039 |
|
splitgs=(int)(pict_get_z2_gsn(p,act_gsn)); |
| 3040 |
|
/* printf("splitgs %i \n",splitgs);*/ |
| 3041 |
|
split_pixel_from_gs(p, x, y, splitgs, uniform_gs, u_r, u_g , u_b); |
| 3042 |
+ |
/* move direct illuminance contribution into zone -value */ |
| 3043 |
+ |
delta_E=DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* luminance(pict_get_color(p, x, y)); |
| 3044 |
+ |
pict_get_Eglare(p,act_gsn ) = pict_get_Eglare(p,act_gsn ) - delta_E; |
| 3045 |
+ |
pict_get_Eglare(p,igs ) = pict_get_Eglare(p,igs ) + delta_E; |
| 3046 |
+ |
|
| 3047 |
|
} |
| 3048 |
|
} |
| 3049 |
|
|
| 3070 |
|
muc_rvar_get_bounding_box(s_z1,bbox_z1); |
| 3071 |
|
if (detail_out == 1) { |
| 3072 |
|
|
| 3073 |
< |
printf ("zoning:z1_omega,z1_av_lum,z1_median_lum,z1_std_lum,z1_perc_75,z1_perc_95,z1_lum_min,z1_lum_max: %f %f %f %f %f %f %f %f\n",omega_z1,lum_z1_av,lum_z1_median[0],sqrt(lum_z1_std[0]),per_75_z1,per_95_z1,bbox_z1[0],bbox_z1[1] ); |
| 3073 |
> |
printf ("zoning:z1_omega,z1_av_lum,z1_median_lum,z1_std_lum,z1_perc_75,z1_perc_95,z1_lum_min,z1_lum_max,Ez1,i_z1: %f %f %f %f %f %f %f %f %f %i\n",omega_z1,lum_z1_av,lum_z1_median[0],sqrt(lum_z1_std[0]),per_75_z1,per_95_z1,bbox_z1[0],bbox_z1[1],Ez1,i_z1 ); |
| 3074 |
|
|
| 3075 |
|
if (zones == 2 ) { |
| 3076 |
|
|
| 3077 |
< |
printf ("zoning:z2_omega,z2_av_lum,z2_median_lum,z2_std_lum,z2_perc_75,z2_perc_95,z2_lum_min,z2_lum_max: %f %f %f %f %f %f %f %f\n",omega_z2,lum_z2_av,lum_z2_median[0],sqrt(lum_z2_std[0]),per_75_z2,per_95_z2,bbox_z2[0],bbox_z2[1] ); |
| 3077 |
> |
printf ("zoning:z2_omega,z2_av_lum,z2_median_lum,z2_std_lum,z2_perc_75,z2_perc_95,z2_lum_min,z2_lum_max,Ez2,i_z2: %f %f %f %f %f %f %f %f %f %i\n",omega_z2,lum_z2_av,lum_z2_median[0],sqrt(lum_z2_std[0]),per_75_z2,per_95_z2,bbox_z2[0],bbox_z2[1],Ez2,i_z1 ); |
| 3078 |
|
} } |
| 3079 |
|
|
| 3080 |
|
} |
| 3081 |
|
|
| 3082 |
+ |
int new_gs_number[igs+1]; |
| 3083 |
+ |
|
| 3084 |
|
i = 0; |
| 3085 |
|
for (x = 0; x <= igs; x++) { |
| 3086 |
|
/* resorting glare source numbers */ |
| 3087 |
|
if (pict_get_npix(p, x) > 0) { |
| 3088 |
|
i = i + 1; |
| 3089 |
+ |
pict_get_Dglare(p,x) = i; |
| 3090 |
+ |
new_gs_number[x] = i; |
| 3091 |
+ |
/* printf("%i %i %f %i \n", i,x,pict_get_Dglare(p,x),new_gs_number[x] ); */ |
| 3092 |
|
} |
| 3093 |
|
} |
| 3094 |
|
no_glaresources=i; |
| 3095 |
< |
|
| 3095 |
> |
/*printf("%i",no_glaresources );*/ |
| 3096 |
|
/* glare sources */ |
| 2732 |
– |
if (detail_out == 1) { |
| 3097 |
|
|
| 3098 |
+ |
if (output == 4 ) { |
| 3099 |
+ |
|
| 3100 |
+ |
i=0; |
| 3101 |
+ |
for (x = 0; x <= igs; x++) { |
| 3102 |
+ |
if (pict_get_npix(p, x) > 0) { |
| 3103 |
+ |
i = i + 1; |
| 3104 |
+ |
|
| 3105 |
+ |
x2=pict_get_av_posx(p, x); |
| 3106 |
+ |
y2=pict_get_av_posy(p, x); |
| 3107 |
+ |
|
| 3108 |
+ |
printf("%i %f %f %f %f %.10f %f %f %f %f \n", |
| 3109 |
+ |
i, pict_get_npix(p, x), pict_get_av_posx(p, x), pict_get_av_posy(p, x), |
| 3110 |
+ |
pict_get_av_lum(p, x), pict_get_av_omega(p, x), |
| 3111 |
+ |
get_posindex(p, pict_get_av_posx(p, x),pict_get_av_posy(p, x),posindex_2), |
| 3112 |
+ |
pict_get_cached_dir(p, x2,y2)[0],pict_get_cached_dir(p, x2,y2)[1],pict_get_cached_dir(p, x2,y2)[2]); |
| 3113 |
+ |
} |
| 3114 |
+ |
} |
| 3115 |
+ |
|
| 3116 |
+ |
|
| 3117 |
+ |
for (y = 0; y < pict_get_ysize(p); y++) { |
| 3118 |
+ |
for (x = 0; x < pict_get_xsize(p); x++) { |
| 3119 |
+ |
|
| 3120 |
+ |
if (pict_get_hangle(p, x, y, p->view.vdir, p->view.vup, &ang)) { |
| 3121 |
+ |
if (pict_is_validpixel(p, x, y)) { |
| 3122 |
+ |
if (pict_get_gsn(p,x,y) >0 ) { |
| 3123 |
+ |
i=pict_get_gsn(p,x,y); |
| 3124 |
+ |
printf("%i %i %f %f %f \n", i, new_gs_number[i], pict_get_cached_dir(p, x,y)[0],pict_get_cached_dir(p, x,y)[1],pict_get_cached_dir(p, x,y)[2] ); |
| 3125 |
+ |
|
| 3126 |
+ |
} |
| 3127 |
+ |
|
| 3128 |
+ |
|
| 3129 |
+ |
|
| 3130 |
+ |
}}}} |
| 3131 |
+ |
|
| 3132 |
+ |
|
| 3133 |
+ |
} |
| 3134 |
+ |
|
| 3135 |
+ |
|
| 3136 |
+ |
|
| 3137 |
+ |
|
| 3138 |
+ |
if (detail_out == 1 && output < 3) { |
| 3139 |
+ |
dgp = get_dgp(p, E_v, igs, a1, a2, a3, a4, a5, c1, c2, c3, posindex_2); |
| 3140 |
+ |
|
| 3141 |
|
printf |
| 3142 |
< |
("%i No pixels x-pos y-pos L_s Omega_s Posindx L_b L_t E_vert Edir Max_Lum Sigma xdir ydir zdir Eglare_cie Lveil_cie teta glare_zone\n", |
| 3142 |
> |
("%i No pixels x-pos y-pos L_s Omega_s Posindx L_b L_t E_v Edir Max_Lum Sigma xdir ydir zdir Eglare Lveil_cie teta glare_zone r_contrast r_dgp\n", |
| 3143 |
|
i); |
| 3144 |
|
if (i == 0) { |
| 3145 |
< |
printf("%i %f %f %f %f %.10f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", i, 0.0, 0.0, |
| 3146 |
< |
0.0, 0.0, 0.0, 0.0, lum_backg, lum_task, E_v, E_v_dir,abs_max,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); |
| 3145 |
> |
printf("%i %f %f %f %f %.10f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", i, 0.0, 0.0, |
| 3146 |
> |
0.0, 0.0, 0.0, 0.0, lum_backg, lum_task, E_v, E_v_dir,abs_max,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); |
| 3147 |
|
|
| 3148 |
|
} else { |
| 3149 |
|
i = 0; |
| 3163 |
|
Lveil_cie =0 ; |
| 3164 |
|
} |
| 3165 |
|
Lveil_cie_sum = Lveil_cie_sum + Lveil_cie; |
| 3166 |
+ |
r_glare= c2*log10(1 + pow(pict_get_av_lum(p, x),2)* pict_get_av_omega(p, x)/pow(get_posindex(p, pict_get_av_posx(p, x), pict_get_av_posy(p, x),posindex_2), 2.0) / pow(E_v, a3)) ; |
| 3167 |
+ |
r_contrast=r_glare/sum_glare ; |
| 3168 |
+ |
r_dgp=r_glare/dgp ; |
| 3169 |
|
if (pict_get_z1_gsn(p,x)<0) { |
| 3170 |
|
act_gsn=(int)(-pict_get_z1_gsn(p,x)); |
| 3171 |
|
}else{ |
| 3172 |
|
act_gsn=0; |
| 3173 |
|
} |
| 3174 |
< |
printf("%i %f %f %f %f %.10f %f %f %f %f %f %f %f %f %f %f %f %f %f %i \n", |
| 3174 |
> |
printf("%i %f %f %f %f %.10f %f %f %f %f %f %f %f %f %f %f %f %f %f %i %f %f \n", |
| 3175 |
|
i, pict_get_npix(p, x), pict_get_av_posx(p, x), |
| 3176 |
|
pict_get_ysize(p) - pict_get_av_posy(p, x), |
| 3177 |
|
pict_get_av_lum(p, x), pict_get_av_omega(p, x), |
| 3179 |
|
pict_get_av_posy(p, x), |
| 3180 |
|
posindex_2), lum_backg, lum_task, |
| 3181 |
|
E_v, E_v_dir, abs_max, sigma * 180 / 3.1415927 |
| 3182 |
< |
,pict_get_cached_dir(p, x2,y2)[0],pict_get_cached_dir(p, x2,y2)[1],pict_get_cached_dir(p, x2,y2)[2],pict_get_Eglare(p,x),Lveil_cie,teta,act_gsn ); |
| 3182 |
> |
,pict_get_cached_dir(p, x2,y2)[0],pict_get_cached_dir(p, x2,y2)[1],pict_get_cached_dir(p, x2,y2)[2],pict_get_Eglare(p,x),Lveil_cie,teta,act_gsn,r_contrast,r_dgp ); |
| 3183 |
|
} |
| 3184 |
|
} |
| 3185 |
|
} |
| 3186 |
|
} |
| 3187 |
|
|
| 3188 |
+ |
if ( output < 3) { |
| 3189 |
|
|
| 2779 |
– |
|
| 3190 |
|
/* calculation of indicees */ |
| 3191 |
|
|
| 3192 |
|
/* check vertical illuminance range */ |
| 3199 |
|
dgp = |
| 3200 |
|
get_dgp(p, E_v2, igs, a1, a2, a3, a4, a5, c1, c2, c3, posindex_2); |
| 3201 |
|
/* low light correction */ |
| 3202 |
+ |
if (lowlight ==1) { |
| 3203 |
|
if (E_v < 1000) { |
| 3204 |
|
low_light_corr=1.0*exp(0.024*E_v-4)/(1+exp(0.024*E_v-4));} else {low_light_corr=1.0 ;} |
| 3205 |
|
dgp =low_light_corr*dgp; |
| 3206 |
< |
|
| 3206 |
> |
} |
| 3207 |
|
/* age correction */ |
| 3208 |
|
|
| 3209 |
|
if (age_corr == 1) { |
| 3224 |
|
dgi = get_dgi(p, lum_backg, igs, posindex_2); |
| 3225 |
|
ugr = get_ugr(p, lum_backg, igs, posindex_2); |
| 3226 |
|
ugp = get_ugp (p,lum_backg, igs, posindex_2); |
| 3227 |
+ |
ugp2 = get_ugp2 (p,lum_backg, igs, posindex_2); |
| 3228 |
|
ugr_exp = get_ugr_exp (p,lum_backg_cos,lum_a, igs, posindex_2); |
| 3229 |
|
dgi_mod = get_dgi_mod(p, lum_a, igs, posindex_2); |
| 3230 |
|
cgi = get_cgi(p, E_v, E_v_dir, igs, posindex_2); |
| 3235 |
|
dgi = 0.0; |
| 3236 |
|
ugr = 0.0; |
| 3237 |
|
ugp = 0.0; |
| 3238 |
+ |
ugp2 =0.0; |
| 3239 |
|
ugr_exp = 0.0; |
| 3240 |
|
dgi_mod = 0.0; |
| 3241 |
|
cgi = 0.0; |
| 3262 |
|
get_dgp(p, E_vl_ext, igs, a1, a2, a3, a4, a5, c1, c2, c3, |
| 3263 |
|
posindex_2); |
| 3264 |
|
dgp = dgp_ext; |
| 3265 |
< |
if (E_vl_ext < 1000) { |
| 3265 |
> |
if (E_vl_ext < 1000 && lowlight ==1) { |
| 3266 |
|
low_light_corr=1.0*exp(0.024*E_vl_ext-4)/(1+exp(0.024*E_vl_ext-4));} else {low_light_corr=1.0 ;} |
| 3267 |
|
dgp =low_light_corr*dgp; |
| 3268 |
|
dgp =age_corr_factor*dgp; |
| 3275 |
|
|
| 3276 |
|
|
| 3277 |
|
printf |
| 3278 |
< |
("dgp,av_lum,E_v,lum_backg,E_v_dir,dgi,ugr,vcp,cgi,lum_sources,omega_sources,Lveil,Lveil_cie,dgr,ugp,ugr_exp,dgi_mod,av_lum_pos,av_lum_pos2,med_lum,med_lum_pos,med_lum_pos2: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", |
| 3278 |
> |
("dgp,av_lum,E_v,lum_backg,E_v_dir,dgi,ugr,vcp,cgi,lum_sources,omega_sources,Lveil,Lveil_cie,dgr,ugp,ugr_exp,dgi_mod,av_lum_pos,av_lum_pos2,med_lum,med_lum_pos,med_lum_pos2,ugp2: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", |
| 3279 |
|
dgp, avlum, E_v, lum_backg, E_v_dir, dgi, ugr, vcp, cgi, |
| 3280 |
< |
lum_sources, omega_sources, Lveil,Lveil_cie_sum,dgr,ugp,ugr_exp,dgi_mod,lum_pos_mean,lum_pos2_mean/sang,lum_nopos_median[0],lum_pos_median[0],lum_pos2_median[0]); |
| 3280 |
> |
lum_sources, omega_sources, Lveil,Lveil_cie_sum,dgr,ugp,ugr_exp,dgi_mod,lum_pos_mean,lum_pos2_mean/sang,lum_nopos_median[0],lum_pos_median[0],lum_pos2_median[0],ugp2); |
| 3281 |
|
} else { |
| 3282 |
|
if (detail_out2 == 1) { |
| 3283 |
|
|
| 3290 |
|
if (ext_vill == 1) { |
| 3291 |
|
dgp_ext = get_dgp(p, E_vl_ext, igs, a1, a2, a3, a4, a5, c1, c2, c3,posindex_2); |
| 3292 |
|
|
| 3293 |
< |
if (E_vl_ext < 1000) { |
| 3293 |
> |
if (E_vl_ext < 1000 && lowlight ==1) { |
| 3294 |
|
low_light_corr=1.0*exp(0.024*E_vl_ext-4)/(1+exp(0.024*E_vl_ext-4));} else {low_light_corr=1.0 ;} |
| 3295 |
|
dgp =low_light_corr*dgp_ext; |
| 3296 |
|
dgp =age_corr_factor*dgp; |
| 3305 |
|
get_dgp(p, E_vl_ext, igs, a1, a2, a3, a4, a5, c1, c2, c3, |
| 3306 |
|
posindex_2); |
| 3307 |
|
dgp = dgp_ext; |
| 3308 |
< |
if (E_vl_ext < 1000) { |
| 3308 |
> |
if (E_vl_ext < 1000 && lowlight ==1) { |
| 3309 |
|
low_light_corr=1.0*exp(0.024*E_vl_ext-4)/(1+exp(0.024*E_vl_ext-4)); } else {low_light_corr=1.0 ;} |
| 3310 |
|
dgp =low_light_corr*dgp; |
| 3311 |
|
|
| 3318 |
|
printf("%f\n", dgp); |
| 3319 |
|
} |
| 3320 |
|
} |
| 3321 |
+ |
} |
| 3322 |
|
|
| 3323 |
+ |
}else{ |
| 3324 |
+ |
/* only multiimagemode |
| 3325 |
+ |
|
| 3326 |
+ |
*/ |
| 3327 |
+ |
|
| 3328 |
+ |
|
| 3329 |
+ |
for (j = 0; j < num_images; j++) { |
| 3330 |
+ |
|
| 3331 |
+ |
|
| 3332 |
+ |
/* loop over temporal images */ |
| 3333 |
+ |
|
| 3334 |
+ |
pict_read(pcoeff,temp_image_name[j] ); |
| 3335 |
+ |
|
| 3336 |
+ |
/*printf ("num_img:%i x-size:%i xpos:%i y-size: %i ypos %i bigimg-xsize %i %i ",num_images,pict_get_xsize(pcoeff),x_temp_img[j],pict_get_ysize(pcoeff),y_temp_img[j],pict_get_xsize(p),pict_get_ysize(p)); |
| 3337 |
+ |
*/ |
| 3338 |
+ |
|
| 3339 |
+ |
|
| 3340 |
+ |
/* loop over scans |
| 3341 |
+ |
empty of */ |
| 3342 |
+ |
for (jj=0;jj<=num_scans;jj++){ |
| 3343 |
+ |
|
| 3344 |
+ |
/*printf("scale %i %i %i %f ",j,jj,num_scans,scale_image_scans[j*(num_scans+1)+jj]); */ |
| 3345 |
+ |
|
| 3346 |
+ |
|
| 3347 |
+ |
/* copy luminance value into big image and remove glare sources*/ |
| 3348 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) { |
| 3349 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3350 |
+ |
xmap=x_temp_img[j]+x; |
| 3351 |
+ |
ymap=y_temp_img[j]+y; |
| 3352 |
+ |
if (xmap <0) { xmap=0;} |
| 3353 |
+ |
if (ymap <0) { ymap=0;} |
| 3354 |
+ |
|
| 3355 |
+ |
pict_get_color(p, xmap, ymap)[RED] = scale_image_scans[j*(num_scans+1)+jj]*pict_get_color(pcoeff, x, y)[RED]; |
| 3356 |
+ |
pict_get_color(p, xmap, ymap)[GRN] = scale_image_scans[j*(num_scans+1)+jj]*pict_get_color(pcoeff, x, y)[GRN]; |
| 3357 |
+ |
pict_get_color(p, xmap, ymap)[BLU] = scale_image_scans[j*(num_scans+1)+jj]*pict_get_color(pcoeff, x, y)[BLU]; |
| 3358 |
+ |
pict_get_gsn(p, xmap, ymap) = 0; |
| 3359 |
+ |
pict_get_pgs(p, xmap, ymap) = 0; |
| 3360 |
+ |
}} |
| 3361 |
+ |
|
| 3362 |
+ |
|
| 3363 |
+ |
|
| 3364 |
+ |
|
| 3365 |
+ |
|
| 3366 |
+ |
actual_igs =0; |
| 3367 |
+ |
|
| 3368 |
+ |
/* first glare source scan: find primary glare sources */ |
| 3369 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) { |
| 3370 |
+ |
lastpixelwas_gs=0; |
| 3371 |
+ |
/* lastpixelwas_peak=0; */ |
| 3372 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3373 |
+ |
xmap=x_temp_img[j]+x; |
| 3374 |
+ |
ymap=y_temp_img[j]+y; |
| 3375 |
+ |
if (pict_get_hangle(p, xmap, ymap, p->view.vdir, p->view.vup, &ang)) { |
| 3376 |
+ |
if (pict_is_validpixel(p, xmap, ymap)) { |
| 3377 |
+ |
act_lum = luminance(pict_get_color(p, xmap, ymap)); |
| 3378 |
+ |
if (act_lum> lum_source) { |
| 3379 |
+ |
if (act_lum >lum_total_max) { |
| 3380 |
+ |
lum_total_max=act_lum; |
| 3381 |
+ |
} |
| 3382 |
+ |
|
| 3383 |
+ |
if (lastpixelwas_gs==0 || search_pix <= 1.0 ) { |
| 3384 |
+ |
actual_igs = find_near_pgs(p, xmap, ymap, max_angle, 0, igs, 1); |
| 3385 |
+ |
} |
| 3386 |
+ |
if (actual_igs == 0) { |
| 3387 |
+ |
igs = igs + 1; |
| 3388 |
+ |
pict_new_gli(p); |
| 3389 |
+ |
pict_get_Eglare(p,igs) = 0.0; |
| 3390 |
+ |
/* not necessary here pict_get_lum_min(p, igs) = HUGE_VAL; |
| 3391 |
+ |
pict_get_Eglare(p,igs) = 0.0; |
| 3392 |
+ |
pict_get_Dglare(p,igs) = 0.0; |
| 3393 |
+ |
pict_get_z1_gsn(p,igs) = 0; |
| 3394 |
+ |
pict_get_z2_gsn(p,igs) = 0; */ |
| 3395 |
+ |
actual_igs = igs; |
| 3396 |
+ |
|
| 3397 |
+ |
} |
| 3398 |
+ |
pict_get_gsn(p, xmap, ymap) = actual_igs; |
| 3399 |
+ |
pict_get_pgs(p, xmap, ymap) = 1; |
| 3400 |
+ |
add_pixel_to_gs(p, xmap, ymap, actual_igs); |
| 3401 |
+ |
lastpixelwas_gs=actual_igs; |
| 3402 |
+ |
|
| 3403 |
+ |
|
| 3404 |
+ |
|
| 3405 |
+ |
delta_E=DOT(p->view.vdir, pict_get_cached_dir(p, xmap, ymap))* pict_get_omega(p, xmap, ymap)* luminance(pict_get_color(p, xmap, ymap)); |
| 3406 |
+ |
pict_get_Eglare(p,actual_igs ) = pict_get_Eglare(p,actual_igs ) + delta_E; |
| 3407 |
+ |
|
| 3408 |
+ |
|
| 3409 |
+ |
|
| 3410 |
+ |
|
| 3411 |
+ |
} else { |
| 3412 |
+ |
pict_get_pgs(p, xmap, ymap) = 0; |
| 3413 |
+ |
lastpixelwas_gs=0; |
| 3414 |
+ |
} |
| 3415 |
+ |
} |
| 3416 |
+ |
} |
| 3417 |
+ |
} |
| 3418 |
+ |
} |
| 3419 |
+ |
|
| 3420 |
+ |
|
| 3421 |
+ |
/* here should be peak extraction */ |
| 3422 |
+ |
i_max=igs; |
| 3423 |
+ |
r_split = max_angle / 2.0; |
| 3424 |
+ |
for (i = 0; i <= i_max; i++) { |
| 3425 |
+ |
|
| 3426 |
+ |
if (pict_get_npix(p, i) > 0) { |
| 3427 |
+ |
l_max = pict_get_lum_max(p, i); |
| 3428 |
+ |
i_splitstart = igs + 1; |
| 3429 |
+ |
if (l_max >= limit) { |
| 3430 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) |
| 3431 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3432 |
+ |
xmap=x_temp_img[j]+x; |
| 3433 |
+ |
ymap=y_temp_img[j]+y; |
| 3434 |
+ |
|
| 3435 |
+ |
|
| 3436 |
+ |
if (pict_get_hangle |
| 3437 |
+ |
(p, xmap, ymap, p->view.vdir, p->view.vup, &ang)) |
| 3438 |
+ |
{ |
| 3439 |
+ |
if (pict_is_validpixel(p, xmap, ymap) |
| 3440 |
+ |
&& luminance(pict_get_color(p, xmap, ymap)) |
| 3441 |
+ |
>= limit |
| 3442 |
+ |
&& pict_get_gsn(p, xmap, ymap) == i) { |
| 3443 |
+ |
if (i_splitstart == (igs + 1)) { |
| 3444 |
+ |
igs = igs + 1; |
| 3445 |
+ |
pict_new_gli(p); |
| 3446 |
+ |
pict_get_z1_gsn(p,igs) = 0; |
| 3447 |
+ |
pict_get_z2_gsn(p,igs) = 0; |
| 3448 |
+ |
|
| 3449 |
+ |
pict_get_Eglare(p,igs) = 0.0; |
| 3450 |
+ |
pict_get_Dglare(p,igs) = 0.0; |
| 3451 |
+ |
pict_get_lum_min(p, igs) = |
| 3452 |
+ |
99999999999999.999; |
| 3453 |
+ |
i_split = igs; |
| 3454 |
+ |
} else { |
| 3455 |
+ |
i_split = |
| 3456 |
+ |
find_split(p, xmap, ymap, r_split, |
| 3457 |
+ |
i_splitstart, igs); |
| 3458 |
+ |
} |
| 3459 |
+ |
if (i_split == 0) { |
| 3460 |
+ |
igs = igs + 1; |
| 3461 |
+ |
pict_new_gli(p); |
| 3462 |
+ |
pict_get_z1_gsn(p,igs) = 0; |
| 3463 |
+ |
pict_get_z2_gsn(p,igs) = 0; |
| 3464 |
+ |
|
| 3465 |
+ |
pict_get_Eglare(p,igs) = 0.0; |
| 3466 |
+ |
pict_get_Dglare(p,igs) = 0.0; |
| 3467 |
+ |
pict_get_lum_min(p, igs) = |
| 3468 |
+ |
99999999999999.999; |
| 3469 |
+ |
i_split = igs; |
| 3470 |
+ |
} |
| 3471 |
+ |
split_pixel_from_gs(p, xmap, ymap, i_split, uniform_gs, u_r, u_g , u_b); |
| 3472 |
+ |
|
| 3473 |
+ |
} |
| 3474 |
+ |
} |
| 3475 |
+ |
} |
| 3476 |
+ |
|
| 3477 |
+ |
} |
| 3478 |
+ |
change = 1; |
| 3479 |
+ |
while (change == 1) { |
| 3480 |
+ |
change = 0; |
| 3481 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) |
| 3482 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3483 |
+ |
xmap=x_temp_img[j]+x; |
| 3484 |
+ |
ymap=y_temp_img[j]+y; |
| 3485 |
+ |
before_igs = pict_get_gsn(p, xmap, ymap); |
| 3486 |
+ |
if (before_igs >= i_splitstart) { |
| 3487 |
+ |
if (pict_get_hangle |
| 3488 |
+ |
(p, xmap, ymap, p->view.vdir, p->view.vup, |
| 3489 |
+ |
&ang)) { |
| 3490 |
+ |
if (pict_is_validpixel(p, xmap, ymap) |
| 3491 |
+ |
&& before_igs > 0) { |
| 3492 |
+ |
actual_igs = |
| 3493 |
+ |
find_near_pgs(p, xmap, ymap, |
| 3494 |
+ |
max_angle, |
| 3495 |
+ |
before_igs, igs, |
| 3496 |
+ |
i_splitstart); |
| 3497 |
+ |
if (!(actual_igs == before_igs)) { |
| 3498 |
+ |
change = 1; |
| 3499 |
+ |
} |
| 3500 |
+ |
if (before_igs > 0) { |
| 3501 |
+ |
actual_igs = |
| 3502 |
+ |
pict_get_gsn(p, xmap, ymap); |
| 3503 |
+ |
/* icol = |
| 3504 |
+ |
setglcolor(p, x, y, |
| 3505 |
+ |
actual_igs, uniform_gs, u_r, u_g , u_b);*/ |
| 3506 |
+ |
} |
| 3507 |
+ |
|
| 3508 |
+ |
} |
| 3509 |
+ |
} |
| 3510 |
+ |
} |
| 3511 |
+ |
|
| 3512 |
+ |
} |
| 3513 |
+ |
} |
| 3514 |
+ |
|
| 3515 |
+ |
|
| 3516 |
+ |
} |
| 3517 |
+ |
} |
| 3518 |
+ |
|
| 3519 |
+ |
/* end peak extraction */ |
| 3520 |
+ |
|
| 3521 |
+ |
|
| 3522 |
+ |
/* calculation of direct vertical illuminance for th multi-image-mode */ |
| 3523 |
+ |
|
| 3524 |
+ |
|
| 3525 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) |
| 3526 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3527 |
+ |
xmap=x_temp_img[j]+x; |
| 3528 |
+ |
ymap=y_temp_img[j]+y; |
| 3529 |
+ |
if (pict_get_hangle(p, xmap, ymap, p->view.vdir, p->view.vup, &ang)) { |
| 3530 |
+ |
if (pict_is_validpixel(p, xmap, ymap)) { |
| 3531 |
+ |
if (pict_get_gsn(p, xmap, ymap) > 0) { |
| 3532 |
+ |
actual_igs = pict_get_gsn(p, xmap, ymap); |
| 3533 |
+ |
delta_E=DOT(p->view.vdir, pict_get_cached_dir(p, xmap, ymap))* pict_get_omega(p, xmap, ymap)* luminance(pict_get_color(p, xmap, ymap)); |
| 3534 |
+ |
pict_get_Eglare(p,actual_igs ) = pict_get_Eglare(p,actual_igs ) + delta_E; |
| 3535 |
+ |
} |
| 3536 |
+ |
} |
| 3537 |
+ |
} |
| 3538 |
+ |
} |
| 3539 |
+ |
|
| 3540 |
+ |
|
| 3541 |
+ |
|
| 3542 |
+ |
|
| 3543 |
+ |
|
| 3544 |
+ |
|
| 3545 |
+ |
|
| 3546 |
+ |
|
| 3547 |
+ |
i = 0; |
| 3548 |
+ |
for (x = 0; x <= igs; x++) { |
| 3549 |
+ |
if (pict_get_npix(p, x) > 0) { |
| 3550 |
+ |
i = i + 1; |
| 3551 |
+ |
}} |
| 3552 |
+ |
no_glaresources=i; |
| 3553 |
+ |
|
| 3554 |
+ |
/* |
| 3555 |
+ |
|
| 3556 |
+ |
sprintf(file_out, "%s%i%s","ray2/img_",j,".hdr"); |
| 3557 |
+ |
pict_write(p, file_out); |
| 3558 |
+ |
*/ |
| 3559 |
+ |
printf("%i ",no_glaresources); |
| 3560 |
+ |
i = 0; |
| 3561 |
+ |
for (x = 0; x <= igs; x++) { |
| 3562 |
+ |
if (pict_get_npix(p, x) > 0) { |
| 3563 |
+ |
i = i + 1; |
| 3564 |
+ |
pict_get_sigma(p, pict_get_av_posx(p, x), pict_get_av_posy(p, x), p->view.vdir, p->view.vup, &sigma); |
| 3565 |
+ |
|
| 3566 |
+ |
x2=pict_get_av_posx(p, x); |
| 3567 |
+ |
y2=pict_get_av_posy(p, x); |
| 3568 |
+ |
printf("%f %.10f %f %f %f %f %f ", pict_get_av_lum(p, x), pict_get_av_omega(p, x), get_posindex(p, pict_get_av_posx(p, x), pict_get_av_posy(p, x), |
| 3569 |
+ |
posindex_2),pict_get_cached_dir(p, x2,y2)[0],pict_get_cached_dir(p, x2,y2)[1],pict_get_cached_dir(p, x2,y2)[2],pict_get_Eglare(p,x) ); |
| 3570 |
+ |
} |
| 3571 |
+ |
pict_get_npix(p, x)=0; |
| 3572 |
+ |
pict_get_av_lum(p, x)=0; |
| 3573 |
+ |
pict_get_av_posy(p, x)=0; |
| 3574 |
+ |
pict_get_av_posx(p, x)=0; |
| 3575 |
+ |
pict_get_av_omega(p, x)=0; |
| 3576 |
+ |
} |
| 3577 |
+ |
printf("\n"); |
| 3578 |
+ |
|
| 3579 |
+ |
|
| 3580 |
+ |
/* empty big image and remove glare sources*/ |
| 3581 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) { |
| 3582 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3583 |
+ |
xmap=x_temp_img[j]+x; |
| 3584 |
+ |
ymap=y_temp_img[j]+y; |
| 3585 |
+ |
pict_get_color(p, xmap, ymap)[RED] = 0; |
| 3586 |
+ |
pict_get_color(p, xmap, ymap)[GRN] = 0; |
| 3587 |
+ |
pict_get_color(p, xmap, ymap)[BLU] = 0; |
| 3588 |
+ |
pict_get_gsn(p, xmap, ymap) = 0; |
| 3589 |
+ |
pict_get_pgs(p, xmap, ymap) = 0; |
| 3590 |
+ |
}} |
| 3591 |
+ |
igs=0; |
| 3592 |
+ |
|
| 3593 |
+ |
|
| 3594 |
+ |
} |
| 3595 |
+ |
|
| 3596 |
+ |
|
| 3597 |
+ |
} |
| 3598 |
+ |
|
| 3599 |
+ |
} |
| 3600 |
+ |
|
| 3601 |
+ |
/* end multi-image-mode */ |
| 3602 |
|
|
| 3603 |
|
/*printf("lowlight=%f\n", low_light_corr); */ |
| 3604 |
|
|