double Parameters::pixelDiff(Shot &test, CMeshO &mesh) { double maxdist = 0.0; double avedist = 0.0; int count = 0; CMeshO::VertexIterator vi; for(vi = pointSamples->vert.begin(); vi != pointSamples->vert.end(); ++vi ) { vcg::Point3f c; c.Import((*vi).P()); Point2f diff = pixelDiff(test, c); double dd = diff.Norm(); if(dd <= 0) continue; //outside of viewpoint if(dd > maxdist) maxdist = dd; avedist += dd*dd; count++; } //for(int i = 0; i < nsamples; i++) //{ // double r = (double)rand() / ((double)(RAND_MAX)+(double)(1)); // double g = (double)rand() / ((double)(RAND_MAX)+(double)(1)); // r = r*16000*16000+g*16000; // int v = ((int)r)%(mesh.vert.size()); // vcg::Point3d c; // c.Import(mesh.vert[v].P()); // Point2d diff = pixelDiff(test, c); // double dd = diff.Norm(); // if(dd <= 0) continue; //outside of viewpoint // if(dd > maxdist) maxdist = dd; // avedist += dd*dd; // count++; //} if(max_norm) return maxdist; return sqrt(avedist/count); }
double Parameters::pixelDiff(Shot &test, CMeshO &mesh, int nsamples) { double maxdist = 0.0; double avedist = 0.0; int count = 0; for(int i = 0; i < nsamples; i++) { double r = (double)rand() / ((double)(RAND_MAX)+(double)(1)); double g = (double)rand() / ((double)(RAND_MAX)+(double)(1)); r = r*16000*16000+g*16000; int v = ((int)r)%(mesh.vert.size()); vcg::Point3f c; c.Import(mesh.vert[v].P()); Point2f diff = pixelDiff(test, c); double dd = diff.Norm(); if(dd <= 0) continue; //outside of viewpoint if(dd > maxdist) maxdist = dd; avedist += dd*dd; count++; } if(max_norm) return maxdist; return sqrt(avedist/count); }