curvature.cpp 4.2 KB

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