ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/Development/ray/src/util/evalglare.c
(Generate patch)

Comparing ray/src/util/evalglare.c (file contents):
Revision 2.12 by greg, Tue Jun 3 21:31:51 2025 UTC vs.
Revision 3.05 by greg, Thu Sep 11 17:40:45 2025 UTC

# Line 1 | Line 1
1   #ifndef lint
2 < static const char RCSid[] = "$Id$";
2 > static const char RCSid[] = "$Id$";
3   #endif
4 < /* EVALGLARE V2.10
5 < * Evalglare Software License, Version 2.0
4 > /* EVALGLARE V3.05
5 > * Evalglare Software License, Version 3.0x
6   *
7 < * Copyright (c) 1995 - 2020 Fraunhofer ISE, EPFL.
7 > * Copyright (c) 1995 - 2022 Fraunhofer ISE, EPFL.
8   * All rights reserved.
9   *
10   *
# Line 356 | Line 356 | calculate "illuminance-contribution of zones"
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 <  
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.10 release 25.06.2020 by EPFL, J.Wienold"
407 > #define VERSION "3.05 release 25.06.2024 by J.Wienold, EPFL"
408   #define RELEASENAME PROGNAME " " VERSION
409  
410  
# Line 370 | Line 415 | calculate "illuminance-contribution of zones"
415   #include "platform.h"
416   #include "muc_randvar.h"
417  
418 + char *progname;
419 +
420   /* subroutine to add a pixel to a glare source */
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;
# Line 386 | Line 433 | void add_pixel_to_gs(pict * p, int x, int y, int gsn)
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  
396        pict_get_av_lum(p, gsn) =
397                (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)) {
# Line 769 | Line 821 | void split_pixel_from_gs(pict * p, int x, int y, int n
821   {
822          int old_gsn, icol;
823          double old_av_posx, old_av_posy, old_av_lum, old_omega, act_omega, delta_E,
824 <                new_omega, act_lum;
824 >                new_omega, act_lum,temp_av_posx,temp_av_posy,av_lum;
825  
826  
827   /* change existing gs */
# Line 786 | Line 838 | void split_pixel_from_gs(pict * p, int x, int y, int n
838  
839          new_omega = old_omega - act_omega;
840          pict_get_av_omega(p, old_gsn) = new_omega;
789        pict_get_av_posx(p, old_gsn) =
790                (old_av_posx * old_omega - x * act_omega) / new_omega;
791        pict_get_av_posy(p, old_gsn) =
792                (old_av_posy * old_omega - y * act_omega) / new_omega;
841  
794
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);
# Line 814 | Line 871 | void split_pixel_from_gs(pict * p, int x, int y, int n
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);
# Line 842 | Line 899 | float get_posindex(pict * p, float x, float y, int pos
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 -
# Line 850 | Line 908 | float get_posindex(pict * p, float x, float y, int pos
908                                                                                                                   0.002963 * tau *
909                                                                                                                   tau) / 100000 *
910                          sigma * sigma);
853 /* below line of sight, using Iwata model */
854        if (phi < 0) {
855                d = 1 / tan(phi);
856                s = tan(teta) / tan(phi);
857                r = sqrt(1 / d * 1 / d + s * s / d / d);
858                if (r > 0.6)
859                        fact = 1.2;
860                if (r > 3) {
861                        fact = 1.2;
862                        r = 3;
863                }
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   }
# Line 1157 | Line 1210 | get_dgp(pict * p, double E_v, int igs, double a1, doub
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 =
# Line 1311 | Line 1364 | float get_ugp(pict * p, double lum_backg, int igs, int
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   {
# Line 1455 | Line 1535 | int main(int argc, char **argv)
1535          pict *p = pict_create();
1536          pict *pm = pict_create();
1537          pict *pcoeff = pict_create();
1538 <        int     lowlight,skip_second_scan,calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin,
1539 <                ext_vill, set_lum_max, set_lum_max2, img_corr,x_disk,y_disk,task_color, i_splitstart,zones,act_gsn,splitgs,j,multi_image_mode,
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,lastpixelwas_peak, 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, E_v_mask,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,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,
# Line 1471 | Line 1553 | int main(int argc, char **argv)
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,pgsv ,pgsv_sat,pgsv_con,
1475 <                abs_max, Lveil;
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;
1560 >        int *x_temp_img, *y_temp_img;
1561 >        double *scale_image_scans;
1562          VIEW userview = STDVIEW;
1563          int gotuserview = 0;
1564          
# Line 1514 | Line 1596 | int main(int argc, char **argv)
1596          muc_rvar_clear(s_posweight2);
1597  
1598          /*set required user view parameters to invalid values*/
1599 <        lowlight=1;
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;        
# Line 1613 | Line 1699 | int main(int argc, char **argv)
1699          abs_max = 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;
# Line 1693 | Line 1779 | int main(int argc, char **argv)
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;
# Line 1887 | Line 1981 | int main(int argc, char **argv)
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 <                        
1895 <                        
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                  
# Line 1932 | Line 2029 | int main(int argc, char **argv)
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   }
# Line 2000 | Line 2099 | if (masking ==1 && zones >0) {
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          }
# Line 2356 | Line 2463 | if (cut_view==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;
2470   /*              lastpixelwas_peak=0; */
# Line 2398 | Line 2507 | if (cut_view==1) {
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    
# Line 2647 | Line 2868 | if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2
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 {
# Line 2769 | Line 2991 | if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2
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;
2772
2994                                                    setglcolor(p,x,y,1,1 , 0.66, 0.01 ,0.33);
2995   /*check if separation gsn already exist */
2996  
# Line 2849 | Line 3070 | if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2
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,Ez1: %f %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],Ez1 );
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,Ez1:  %f %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],Ez2 );
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   /*printf("%i",no_glaresources );*/
3096   /* glare sources */
2871        if (detail_out == 1 && output != 3) {
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;
# Line 2895 | Line 3163 | if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2
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),
# Line 2908 | Line 3179 | if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2
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) {
3188 > if ( output < 3) {
3189  
3190   /* calculation of indicees */
3191  
# Line 2953 | Line 3224 | if (calcfast == 0) {
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);
# Line 2963 | Line 3235 | if (calcfast == 0) {
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;
# Line 2989 | Line 3262 | if (calcfast == 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;
# Line 3002 | Line 3275 | if (calcfast == 0) {
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  
# Line 3017 | Line 3290 | if (calcfast == 0) {
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;
# Line 3032 | Line 3305 | if (calcfast == 0) {
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  
# Line 3048 | Line 3321 | if (calcfast == 0) {
3321   }
3322  
3323   }else{
3324 < /* only multiimagemode */
3324 > /* only multiimagemode                        
3325  
3326 + */
3327  
3328 +
3329                         for (j = 0; j < num_images; j++) {
3330  
3331                                  
# Line 3061 | Line 3336 | pict_read(pcoeff,temp_image_name[j] );
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-1;
3351 <                        ymap=y_temp_img[j]+y-1;
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] = pict_get_color(pcoeff, x, y)[RED];
3356 <                        pict_get_color(p, xmap, ymap)[GRN] = pict_get_color(pcoeff, x, y)[GRN];
3357 <                        pict_get_color(p, xmap, ymap)[BLU] = pict_get_color(pcoeff, x, y)[BLU];
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 */
# Line 3088 | Line 3375 | actual_igs =0;
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) {
3378 >                                        if (act_lum> lum_source) {
3379                                                  if (act_lum >lum_total_max) {
3380                                                                               lum_total_max=act_lum;
3381                                                                                 }
# Line 3304 | Line 3591 | printf("\n");
3591   igs=0;
3592  
3593  
3594 <
3594 > }
3595  
3596  
3597   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines