curvature.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #define IGL_HEADER_ONLY
  2. #include <igl/principal_curvature.h>
  3. #include <igl/read_triangle_mesh.h>
  4. #include <iostream>
  5. #include <Eigen/Dense>
  6. #include <Eigen/Sparse>
  7. using namespace std;
  8. bool cont=true;
  9. bool benchmark=false;
  10. void print_help()
  11. {
  12. cout << "Usage: Curvature -i meshfile [-o curvfile] [-S scalefile] "
  13. "[-k N | -e F] [-a] [-l] [-p] [-m N] [-s] [-z] [-b] [-n N] [-M N] [-h] \n"
  14. " -k N: compute using the N-ring of vertexes.\n"
  15. " -e S: compute using a sphere of radius R = S * mesh_average_edge.\n"
  16. " -a: no projection plane, use normals average.\n"
  17. " -l: local mode, use vcg normal (when using -a) or incident faces normal (default)\n"
  18. " -p: check projection plane calculation\n"
  19. " -m N: use montecarlo, extract N vertices maximum.\n"
  20. " -b: benchmark mode\n"
  21. " -n N: step for benchmarking\n"
  22. " -M N: max size for benchmarking\n"
  23. " -s: use svd calculation, not pseudoinverse.\n"
  24. " -z: check if determinant is almost zero.\n"
  25. " -h: print this help and exit.\n";
  26. }
  27. bool isDir(char* file)
  28. {
  29. std::string s(file);
  30. return (s.find_last_of('/')==s.size()-1);
  31. }
  32. void app_init(int argc, char* argv[], CurvatureCalculator& c, Eigen::MatrixXd& V, Eigen::MatrixXi& F)
  33. {
  34. if (argc<2)
  35. {
  36. print_help();
  37. exit(0);
  38. }
  39. char* tmp;
  40. const char* meshName;
  41. char * scaleFile;
  42. for (argc--, argv++; argc--; argv++)
  43. {
  44. if( (*argv)[0] == '-')
  45. {
  46. switch( (*argv)[1] )
  47. {
  48. case 'b':
  49. benchmark=true;
  50. break;
  51. case 'n':
  52. tmp=*++argv;
  53. if (!strcmp(tmp,"exp"))
  54. c.expStep=true;
  55. else
  56. c.step=atoi(tmp);
  57. --argc;
  58. break;
  59. case 'M':
  60. c.maxSize=atoi(*++argv);
  61. argc--;
  62. break;
  63. case 'i':
  64. meshName=*++argv;
  65. igl::read_triangle_mesh(meshName,V,F);
  66. argc--;
  67. break;
  68. case 'k':
  69. c.st=K_RING_SEARCH;
  70. c.kRing = atoi (*++argv);
  71. argc--;
  72. break;
  73. case 'e':
  74. c.st=SPHERE_SEARCH;
  75. c.sphereRadius = atof (*++argv);
  76. argc--;
  77. break;
  78. case 'a':
  79. c.nt=AVERAGE;
  80. break;
  81. case 'l':
  82. c.localMode = true;
  83. break;
  84. case 'p':
  85. c.projectionPlaneCheck = true;
  86. break;
  87. case 'm':
  88. c.montecarlo=true;
  89. c.montecarloN = atoi (*++argv);
  90. argc--;
  91. break;
  92. case 's':
  93. c.svd = true;
  94. break;
  95. case 'z':
  96. c.zeroDetCheck = true;
  97. break;
  98. case 'f':
  99. /* dc.fitCreaseMode = atoi (*++argv);
  100. argc--;*/
  101. break;
  102. case 'o':
  103. tmp=*++argv;
  104. cerr << "Tmp: " << tmp << endl;
  105. if (isDir(tmp))
  106. {
  107. std::string tmpS(tmp);
  108. std::string tmpM(meshName);
  109. size_t pos=tmpM.find_last_of('/');
  110. tmpM.assign(tmpM.begin()+pos+1,tmpM.end());
  111. c.lastMeshName=tmpS+tmpM;
  112. }
  113. else
  114. c.lastMeshName=tmp;
  115. argc--;
  116. break;
  117. case 'h':
  118. print_help();
  119. exit(0);
  120. default:
  121. print_help();
  122. exit(0);
  123. }
  124. }
  125. }
  126. return;
  127. }
  128. int main(int argc, char *argv[])
  129. {
  130. CurvatureCalculator c;
  131. Eigen::MatrixXd V;
  132. Eigen::MatrixXi F;
  133. string filename;
  134. app_init(argc,argv,c,V,F);
  135. c.init(V,F);
  136. c.computeCurvature();
  137. c.printCurvature(c.lastMeshName);
  138. }