139int main( 
int argc, 
char* argv[] )
 
  147  using namespace DGtal;
 
  154  std::string input = argv[ 1 ];
 
  155  int    m = argc > 2 ? atoi( argv[ 2 ] ) : 20;  
 
  156  int    n = argc > 3 ? atoi( argv[ 3 ] ) : 20;  
 
  157  double R = argc > 4 ? atof( argv[ 4 ] ) : 0.5; 
 
  161  double exp_K1_min = 0.0;
 
  162  double exp_K1_max = 0.0;
 
  163  double exp_K2_min = 0.0;
 
  164  double exp_K2_max = 0.0;
 
  165  if ( input == 
"torus" )
 
  167      const double big_radius   = 3.0;
 
  168      const double small_radius = 1.00001; 
 
  169      smesh = SMH::makeTorus( big_radius, small_radius,
 
  171                              SMH::NormalsType::VERTEX_NORMALS );
 
  172      exp_K1_min = ( 1.0 / ( small_radius - big_radius ) );
 
  173      exp_K1_max = ( 1.0 / ( big_radius + small_radius ) );
 
  174      exp_K2_min = 1.0 / small_radius;
 
  175      exp_K2_max = 1.0 / small_radius;
 
  177  else if ( input == 
"sphere" )
 
  179      const double radius = 2.0;
 
  180      smesh = SMH::makeSphere( radius, 
RealPoint { 0.0, 0.0, 0.0 }, m, n,
 
  181                               SMH::NormalsType::VERTEX_NORMALS );
 
  182      exp_K1_min = 1.0 / radius;
 
  183      exp_K1_max = 1.0 / radius;
 
  184      exp_K2_min = 1.0 / radius;
 
  185      exp_K2_max = 1.0 / radius;
 
  187  else if ( input == 
"lantern" )
 
  189      const double radius = 2.0;
 
  190      smesh = SMH::makeLantern( radius, 1.0, 
RealPoint { 0.0, 0.0, 0.0 }, m, n,
 
  191                                SMH::NormalsType::VERTEX_NORMALS );
 
  194      exp_K2_min = 1.0 / radius;
 
  195      exp_K2_max = 1.0 / radius;
 
  203  auto mu0  = cnc.computeMu0();
 
  204  auto muXY = cnc.computeMuXY();
 
  210  std::vector< double > K1( smesh.nbFaces() );
 
  211  std::vector< double > K2( smesh.nbFaces() );
 
  212  std::vector< RealVector > D1( smesh.nbFaces() );
 
  213  std::vector< RealVector > D2( smesh.nbFaces() );
 
  215  smesh.computeFaceNormalsFromPositions();
 
  216  for ( 
auto f = 0; f < smesh.nbFaces(); ++f )
 
  218      const auto b    = smesh.faceCentroid( f );
 
  219      const auto N    = smesh.faceNormals()[ f ];
 
  220      const auto area = mu0 .measure( b, R, f );
 
  221      const auto M    = muXY.measure( b, R, f );
 
  222      std::tie( K1[ f ], K2[ f ], D1[ f ], D2[ f ] )
 
  223        = cnc.principalCurvatures( area, M, N );
 
  228  auto K1_min_max = std::minmax_element( K1.cbegin(), K1.cend() );
 
  229  auto K2_min_max = std::minmax_element( K2.cbegin(), K2.cend() );
 
  230  std::cout << 
"Expected k1 curvatures:" 
  231            << 
" min=" << exp_K1_min << 
" max=" << exp_K1_max
 
  233  std::cout << 
"Computed k1 curvatures:" 
  234            << 
" min=" << *K1_min_max.first << 
" max=" << *K1_min_max.second
 
  236  std::cout << 
"Expected k2 curvatures:" 
  237            << 
" min=" << exp_K2_min << 
" max=" << exp_K2_max
 
  239  std::cout << 
"Computed k2 curvatures:" 
  240            << 
" min=" << *K2_min_max.first << 
" max=" << *K2_min_max.second
 
  249  auto colorsK1 = SMW::Colors( smesh.nbFaces() );
 
  250  auto colorsK2 = SMW::Colors( smesh.nbFaces() );
 
  251  for ( 
auto i = 0; i < smesh.nbFaces(); i++ )
 
  253      colorsK1[ i ] = colormapK1( K1[ i ] );
 
  254      colorsK2[ i ] = colormapK2( K2[ i ] );
 
  256  SMW::writeOBJ( 
"example-cnc-K1", smesh, colorsK1 );
 
  257  SMW::writeOBJ( 
"example-cnc-K2", smesh, colorsK2 );
 
  258  const auto avg_e = smesh.averageEdgeLength();
 
  259  SH::RealPoints positions( smesh.nbFaces() );
 
  260  for ( 
auto f = 0; f < positions.size(); ++f )
 
  262      D1[ f ] *= smesh.localWindow( f );
 
  263      positions[ f ] = smesh.faceCentroid( f ) - 0.5 * D1[ f ];
 
  265  SH::saveVectorFieldOBJ( positions, D1, 0.05 * avg_e, SH::Colors(),
 
  267                          SH::Color::Black, SH::Color( 0, 128, 0 ) );
 
  268  for ( 
auto f = 0; f < positions.size(); ++f )
 
  270      D2[ f ] *= smesh.localWindow( f );
 
  271      positions[ f ] = smesh.faceCentroid( f ) - 0.5 * D2[ f ];
 
  273  SH::saveVectorFieldOBJ( positions, D2, 0.05 * avg_e, SH::Colors(),
 
  275                          SH::Color::Black, SH::Color(128, 0,128 ) );