124int main( 
int argc, 
char* argv[] )
 
  132  using namespace DGtal;
 
  139  std::string input = argv[ 1 ];
 
  140  int    m = argc > 2 ? atoi( argv[ 2 ] ) : 20;  
 
  141  int    n = argc > 3 ? atoi( argv[ 3 ] ) : 20;  
 
  142  double R = argc > 4 ? atof( argv[ 4 ] ) : 0.5; 
 
  146  double exp_K1_min = 0.0;
 
  147  double exp_K1_max = 0.0;
 
  148  double exp_K2_min = 0.0;
 
  149  double exp_K2_max = 0.0;
 
  150  if ( input == 
"torus" )
 
  152      const double big_radius   = 3.0;
 
  153      const double small_radius = 1.00001; 
 
  154      smesh = SMH::makeTorus( big_radius, small_radius,
 
  156                              SMH::NormalsType::VERTEX_NORMALS );
 
  157      exp_K1_min = ( 1.0 / ( small_radius - big_radius ) );
 
  158      exp_K1_max = ( 1.0 / ( big_radius + small_radius ) );
 
  159      exp_K2_min = 1.0 / small_radius;
 
  160      exp_K2_max = 1.0 / small_radius;
 
  162  else if ( input == 
"sphere" )
 
  164      const double radius = 2.0;
 
  165      smesh = SMH::makeSphere( radius, 
RealPoint { 0.0, 0.0, 0.0 }, m, n,
 
  166                               SMH::NormalsType::VERTEX_NORMALS );
 
  167      exp_K1_min = 1.0 / radius;
 
  168      exp_K1_max = 1.0 / radius;
 
  169      exp_K2_min = 1.0 / radius;
 
  170      exp_K2_max = 1.0 / radius;
 
  172  else if ( input == 
"lantern" )
 
  174      const double radius = 2.0;
 
  175      smesh = SMH::makeLantern( radius, 1.0, 
RealPoint { 0.0, 0.0, 0.0 }, m, n,
 
  176                                SMH::NormalsType::VERTEX_NORMALS );
 
  179      exp_K2_min = 1.0 / radius;
 
  180      exp_K2_max = 1.0 / radius;
 
  188  auto mu0  = nc.computeMu0();
 
  189  auto muXY = nc.computeMuXY();
 
  195  std::vector< double > K1( smesh.nbFaces() );
 
  196  std::vector< double > K2( smesh.nbFaces() );
 
  197  std::vector< RealVector > D1( smesh.nbFaces() );
 
  198  std::vector< RealVector > D2( smesh.nbFaces() );
 
  200  smesh.computeFaceNormalsFromPositions();
 
  201  for ( 
auto f = 0; f < smesh.nbFaces(); ++f )
 
  203      const auto b    = smesh.faceCentroid( f );
 
  204      const auto N    = smesh.faceNormals()[ f ];
 
  205      const auto area = mu0 .measure( b, R, f );
 
  206      const auto M    = muXY.measure( b, R, f );
 
  207      std::tie( K1[ f ], K2[ f ], D1[ f ], D2[ f ] )
 
  208        = nc.principalCurvatures( area, M, N );
 
  213  auto K1_min_max = std::minmax_element( K1.cbegin(), K1.cend() );
 
  214  auto K2_min_max = std::minmax_element( K2.cbegin(), K2.cend() );
 
  215  std::cout << 
"Expected k1 curvatures:" 
  216            << 
" min=" << exp_K1_min << 
" max=" << exp_K1_max
 
  218  std::cout << 
"Computed k1 curvatures:" 
  219            << 
" min=" << *K1_min_max.first << 
" max=" << *K1_min_max.second
 
  221  std::cout << 
"Expected k2 curvatures:" 
  222            << 
" min=" << exp_K2_min << 
" max=" << exp_K2_max
 
  224  std::cout << 
"Computed k2 curvatures:" 
  225            << 
" min=" << *K2_min_max.first << 
" max=" << *K2_min_max.second
 
  234  auto colorsK1 = SMW::Colors( smesh.nbFaces() );
 
  235  auto colorsK2 = SMW::Colors( smesh.nbFaces() );
 
  236  for ( 
auto i = 0; i < smesh.nbFaces(); i++ )
 
  238      colorsK1[ i ] = colormapK1( K1[ i ] );
 
  239      colorsK2[ i ] = colormapK2( K2[ i ] );
 
  241  SMW::writeOBJ( 
"example-nc-K1", smesh, colorsK1 );
 
  242  SMW::writeOBJ( 
"example-nc-K2", smesh, colorsK2 );
 
  243  const auto avg_e = smesh.averageEdgeLength();
 
  244  SH::RealPoints positions( smesh.nbFaces() );
 
  245  for ( 
auto f = 0; f < positions.size(); ++f )
 
  247      D1[ f ] *= smesh.localWindow( f );
 
  248      positions[ f ] = smesh.faceCentroid( f ) - 0.5 * D1[ f ];
 
  250  SH::saveVectorFieldOBJ( positions, D1, 0.05 * avg_e, SH::Colors(),
 
  252                          SH::Color::Black, SH::Color( 0, 128, 0 ) );
 
  253  for ( 
auto f = 0; f < positions.size(); ++f )
 
  255      D2[ f ] *= smesh.localWindow( f );
 
  256      positions[ f ] = smesh.faceCentroid( f ) - 0.5 * D2[ f ];
 
  258  SH::saveVectorFieldOBJ( positions, D2, 0.05 * avg_e, SH::Colors(),
 
  260                          SH::Color::Black, SH::Color(128, 0,128 ) );