Пример #1
0
visual_pose_estimation::PoseEstimator createCheckerboardEstimator(int width, int height, float square_size)
{
  cv::Mat_<cv::Vec3f> grid_points(width*height, 1);
  int j = 0;
  for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
      grid_points(j, 0) = cv::Vec3f(x*square_size, y*square_size, 0.0f);
      ++j;
    }
  }

  return visual_pose_estimation::PoseEstimator(grid_points);
}
Пример #2
0
void create_circle( std::vector<Vec3d>& verts, 
                   std::vector<Vec3st>& tris, 
                   std::vector<double>& masses,
                   const Vec3d& centre,
                   double radius,
                   size_t nx )
{
    Vec3d low = centre - Vec3d( radius, 0.0, radius );
    
    double dx = 2.0 * radius / (double)nx;
    
    Array2<Vec3d> grid_points;
    grid_points.resize(nx, nx);
    for ( size_t i = 0; i < nx; ++i )
    {
        for ( size_t j = 0; j < nx; ++j )
        {
            grid_points(i,j) = low + dx * Vec3d( i, 0, j );
            verts.push_back( low + dx * Vec3d( i, 0, j ) );
        }
    }
    
    // cells
    for ( size_t i = 0; i < nx-1; ++i )
    {
        for ( size_t j = 0; j < nx-1; ++j )
        {
            size_t a = i   + nx*j;
            size_t b = i+1 + nx*j;
            size_t c = i+1 + nx*(j+1);
            size_t d = i   + nx*(j+1);
            
            
            if ( ( dist( verts[a], centre ) < radius ) &&
                ( dist( verts[b], centre ) < radius ) &&
                ( dist( verts[d], centre ) < radius ) )
            {
                tris.push_back( Vec3st( a, b, d ) );
            }
            
            if ( ( dist( verts[b], centre ) < radius ) &&
                ( dist( verts[c], centre ) < radius ) &&
                ( dist( verts[d], centre ) < radius ) )            
            {
                tris.push_back( Vec3st( b, c, d ) );
            }
        }
    }
    
    masses.clear();
    masses.resize( verts.size(), 1.0 );
    
    NonDestructiveTriMesh temp_tri_mesh;
    temp_tri_mesh.set_num_vertices( verts.size() );
    for ( size_t i = 0; i < tris.size(); ++i )
    {
        temp_tri_mesh.add_triangle( tris[i] );
    }
    
}
Пример #3
0
void error_norm(double rms[]) {

//---------------------------------------------------------------------
//---------------------------------------------------------------------

//---------------------------------------------------------------------
//     this function computes the norm of the difference between the
//     computed solution and the exact solution
//---------------------------------------------------------------------

      int c, i, j, k, m, ii, jj, kk, d, error;
      double xi, eta, zeta, u_exact[5], rms_work[5],
           add;

      for (m = 1; m <= 5; m++) {
         rms_work(m) = 0.0e0;
      }

      for (c = 1; c <= ncells; c++) {
         kk = 0;
         for (k = cell_low(3,c); k <= cell_high(3,c); k++) {
            zeta = (double)(k) * dnzm1;
            jj = 0;
            for (j = cell_low(2,c); j <= cell_high(2,c); j++) {
               eta = (double)(j) * dnym1;
               ii = 0;
               for (i = cell_low(1,c); i <= cell_high(1,c); i++) {
                  xi = (double)(i) * dnxm1;
                  exact_solution(xi, eta, zeta, u_exact);

                  for (m = 1; m <= 5; m++) {
                     add = u(m,ii,jj,kk,c)-u_exact(m);
                     rms_work(m) = rms_work(m) + add*add;
                  }
                  ii = ii + 1;
               }
               jj = jj + 1;
            }
            kk = kk + 1;
         }
      }

      RCCE_allreduce((char*)rms_work, (char*)rms, 5, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);

      for (m = 1; m <= 5; m++) {
         for (d = 1; d <= 3; d++) {
            rms(m) = rms(m) / (double)(grid_points(d)-2);
         }
         rms(m) = sqrt(rms(m));
      }

      return;
}
Пример #4
0
void rhs_norm(double rms[]) {

//---------------------------------------------------------------------
//---------------------------------------------------------------------

      int c, i, j, k, d, m, error;
      double rms_work[5], add;

      for (m = 1; m <= 5; m++) {
         rms_work(m) = 0.0e0;
      }

      for (c = 1; c <= ncells; c++) {
         for (k = start(3,c); k <= cell_size(3,c)-end(3,c)-1; k++) {
            for (j = start(2,c); j <= cell_size(2,c)-end(2,c)-1; j++) {
               for (i = start(1,c); i <= cell_size(1,c)-end(1,c)-1; i++) {
                  for (m = 1; m <= 5; m++) {
                     add = rhs(m,i,j,k,c);
                     rms_work(m) = rms_work(m) + add*add;
                  }
               }
            }
         }
      }

      RCCE_allreduce((char*)rms_work, (char*)rms, 5, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);

      for (m = 1; m <= 5; m++) {
         for (d = 1; d <= 3; d++) {
            rms(m) = rms(m) / (double)(grid_points(d)-2);
         }
         rms(m) = sqrt(rms(m));
      }

      return;
}
Пример #5
0
void verify(int no_time_steps, char *class_r, int *verified_r) {

//---------------------------------------------------------------------
//---------------------------------------------------------------------

//---------------------------------------------------------------------
//  verification routine                         
//---------------------------------------------------------------------

        double xcrref[5],xceref[5],xcrdif[5],xcedif[5], 
               epsilon, xce[5], xcr[5], dtref;
        int m;
        char class;
        int verified;
#define xcrref(m) xcrref[m-1]
#define xceref(m) xceref[m-1]
#define xcrdif(m) xcrdif[m-1]
#define xcedif(m) xcedif[m-1]
#define xce(m) xce[m-1]
#define xcr(m) xcr[m-1]

//---------------------------------------------------------------------
//   tolerance level
//---------------------------------------------------------------------
        epsilon = 1.0e-08;
        verified = 1;

//---------------------------------------------------------------------
//   compute the error norm and the residual norm, and exit if not printing
//---------------------------------------------------------------------

        error_norm(xce);

        copy_faces();

        rhs_norm(xcr);

        for (m = 1; m <= 5; m++) {
           xcr(m) = xcr(m) / dt;
        }

        if (node != root) return;

        class = 'U';

        for (m = 1; m <= 5; m++) {
           xcrref(m) = 1.0;
           xceref(m) = 1.0;
        }

//---------------------------------------------------------------------
//    reference data for 12X12X12 grids after 60 time steps, with DT = 1.0e-02
//---------------------------------------------------------------------
        if ( (grid_points(1)  == 12     ) && 
             (grid_points(2)  == 12     ) &&
             (grid_points(3)  == 12     ) &&
             (no_time_steps   == 60    )) {

           class = 'S';
           dtref = 1.0e-2;

//---------------------------------------------------------------------
//  Reference values of RMS-norms of residual.
//---------------------------------------------------------------------
         xcrref(1) = 1.7034283709541311e-01;
         xcrref(2) = 1.2975252070034097e-02;
         xcrref(3) = 3.2527926989486055e-02;
         xcrref(4) = 2.6436421275166801e-02;
         xcrref(5) = 1.9211784131744430e-01;

//---------------------------------------------------------------------
//  Reference values of RMS-norms of solution error.
//---------------------------------------------------------------------

           xceref(1) = 4.9976913345811579e-04;
           xceref(2) = 4.5195666782961927e-05;
           xceref(3) = 7.3973765172921357e-05;
           xceref(4) = 7.3821238632439731e-05;
           xceref(5) = 8.9269630987491446e-04;

//---------------------------------------------------------------------
//    reference data for 24X24X24 grids after 200 time steps, with DT = 0.8e-3
//---------------------------------------------------------------------
        } else if ( (grid_points(1) == 24) &&