main.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <igl/doublearea.h>
  2. #include <igl/internal_angles.h>
  3. #include <igl/is_irregular_vertex.h>
  4. #include <igl/readOBJ.h>
  5. #include <igl/PI.h>
  6. #include <Eigen/Core>
  7. #include <iostream>
  8. #include "tutorial_shared_path.h"
  9. int main(int argc, char *argv[])
  10. {
  11. using namespace Eigen;
  12. using namespace std;
  13. MatrixXd V;
  14. MatrixXi F;
  15. igl::readOBJ(TUTORIAL_SHARED_PATH "/horse_quad.obj",V,F);
  16. // Count the number of irregular vertices, the border is ignored
  17. vector<bool> irregular = igl::is_irregular_vertex(V,F);
  18. int vertex_count = V.rows();
  19. int irregular_vertex_count =
  20. std::count(irregular.begin(),irregular.end(),true);
  21. double irregular_ratio = double(irregular_vertex_count)/vertex_count;
  22. printf("Irregular vertices: \n%d/%d (%.2f%%)\n",
  23. irregular_vertex_count,vertex_count, irregular_ratio*100);
  24. // Compute areas, min, max and standard deviation
  25. VectorXd area;
  26. igl::doublearea(V,F,area);
  27. area = area.array() / 2;
  28. double area_avg = area.mean();
  29. double area_min = area.minCoeff() / area_avg;
  30. double area_max = area.maxCoeff() / area_avg;
  31. double area_sigma = sqrt(((area.array()-area_avg)/area_avg).square().mean());
  32. printf("Areas (Min/Max)/Avg_Area Sigma: \n%.2f/%.2f (%.2f)\n",
  33. area_min,area_max,area_sigma);
  34. // Compute per face angles, min, max and standard deviation
  35. MatrixXd angles;
  36. igl::internal_angles(V,F,angles);
  37. angles = 360.0 * (angles/(2*igl::PI)); // Convert to degrees
  38. double angle_avg = angles.mean();
  39. double angle_min = angles.minCoeff();
  40. double angle_max = angles.maxCoeff();
  41. double angle_sigma = sqrt( (angles.array()-angle_avg).square().mean() );
  42. printf("Angles in degrees (Min/Max) Sigma: \n%.2f/%.2f (%.2f)\n",
  43. angle_min,angle_max,angle_sigma);
  44. }