Esempio n. 1
0
/* ----------------------------------------------------------------
 *                   CALCULATE FINAL INTENSITIES
 *-----------------------------------------------------------------*/
void MainWindow::calculateFinalIntensities(Subdiv2D& subdiv){
    int nearestCell;

    for(int i=0; i<NUMBEROFLIGHTSOURCES; i++){
         voronoiIntensities[i][0] = 0;
         voronoiIntensities[i][1] = 0;
         voronoiIntensities[i][2] = 0;
         voronoiIntensities[i][3] = 0;
         finalVoronoiIntensities[i][0] = 0;
         finalVoronoiIntensities[i][1] = 0;
         finalVoronoiIntensities[i][2] = 0;
         finalVoronoiColors[i][0] = 0;
         finalVoronoiColors[i][1] = 0;
         finalVoronoiColors[i][2] = 0;
         averageTheta[i] = 0;
    }
    //red-green-blue.pfm  grace_lat_long.pfm
    const char* imageName = lightMapPathname.toStdString().c_str();
    unsigned int mapLatitude = 1024;
    unsigned int mapLongtitude = 512;
    unsigned int mapComponenets = 3;
    lightProbePFM = loadPFM(imageName, mapLatitude, mapLongtitude, mapComponenets);

    int i=0;

      for(int theta=0; theta<LONGTITUDE; theta++){
          for(int phi=0; phi<LATITUDE; phi++){
            for(int color=0; color<COLORCOMPONENTS; color++){

                Point2f fp(phi,theta);
                Point2f nearestCentroid;
                subdiv.findNearest(fp, &nearestCentroid);
                nearestCell = findNearestCell(nearestCentroid);

                //summing all theta of points from the same cell for the SOLID ANGLE
                float scaledTheta;
                float scalar = LONGTITUDE/PI;
                scaledTheta = theta/scalar;

                // change R
                if(color==0){
                    voronoiIntensities[nearestCell][0] += 1.0;
                    voronoiIntensities[nearestCell][1] += (lightProbePFM[i]*qSin(scaledTheta));
                }

                // change G
                else if(color==1){
                    voronoiIntensities[nearestCell][2] += (lightProbePFM[i]*qSin(scaledTheta));
                }

                // change B
                else if(color==2){
                    voronoiIntensities[nearestCell][3] += (lightProbePFM[i]*qSin(scaledTheta));
                }

                // next index
                i++;
            }
        }
    }

    float scalar;

    for(int i=0; i<NUMBEROFLIGHTSOURCES; i++){

        if(voronoiIntensities[i][0]!=0)
        {
            finalVoronoiIntensities[i][0] = voronoiIntensities[i][1]/voronoiIntensities[i][0];
            finalVoronoiIntensities[i][1] = voronoiIntensities[i][2]/voronoiIntensities[i][0];
            finalVoronoiIntensities[i][2] = voronoiIntensities[i][3]/voronoiIntensities[i][0];
        }

          // final cell intensity is the contrast added to the RF images
         finalCellIntensity[i] = (finalVoronoiIntensities[i][0]+finalVoronoiIntensities[i][1]+finalVoronoiIntensities[i][2])/3;

           //normalise values to get colour between 0-1
         scalar = (finalVoronoiIntensities[i][0] + finalVoronoiIntensities[i][1] + finalVoronoiIntensities[i][2])/15;

         finalVoronoiColors[i][0] = finalVoronoiIntensities[i][0]/scalar;
         finalVoronoiColors[i][1] = finalVoronoiIntensities[i][1]/scalar;
         finalVoronoiColors[i][2] = finalVoronoiIntensities[i][2]/scalar;

     }
}