Browse Source

* finished tutorial example for tetgen

Former-commit-id: b3d16d209fbaecc62204ae9437d03fe396daedc4
Daniele Panozzo 11 years ago
parent
commit
316acffeaf
1 changed files with 51 additions and 4 deletions
  1. 51 4
      tutorial/605_Tetgen/main.cpp

+ 51 - 4
tutorial/605_Tetgen/main.cpp

@@ -1,16 +1,61 @@
 #include <igl/viewer/Viewer.h>
 #include <igl/tetgen/tetrahedralize.h>
 #include <igl/readOFF.h>
+#include <igl/barycenter.h>
 
 // Input polygon
 Eigen::MatrixXd V;
 Eigen::MatrixXi F;
+Eigen::MatrixXd B;
 
 // Tetrahedralized interior
 Eigen::MatrixXd TV;
 Eigen::MatrixXi TT;
 Eigen::MatrixXi TF;
 
+// This function is called every time a keyboard button is pressed
+bool key_down(igl::Viewer& viewer, unsigned char key, int modifier)
+{
+  using namespace std;
+  using namespace Eigen;
+
+  if (key >= '1' && key <= '9')
+  {
+    double t = double((key - '1')+1) / 9.0;
+
+    VectorXd v = B.col(2).array() - B.col(2).minCoeff();
+    v /= v.col(0).maxCoeff();
+
+    vector<int> s;
+
+    for (unsigned i=0; i<v.size();++i)
+      if (v(i) < t)
+        s.push_back(i);
+
+    MatrixXd V_temp(s.size()*4,3);
+    MatrixXi F_temp(s.size()*4,3);
+
+    for (unsigned i=0; i<s.size();++i)
+    {
+      V_temp.row(i*4+0) = TV.row(TT(s[i],0));
+      V_temp.row(i*4+1) = TV.row(TT(s[i],1));
+      V_temp.row(i*4+2) = TV.row(TT(s[i],2));
+      V_temp.row(i*4+3) = TV.row(TT(s[i],3));
+      F_temp.row(i*4+0) << (i*4)+0, (i*4)+1, (i*4)+3;
+      F_temp.row(i*4+1) << (i*4)+0, (i*4)+2, (i*4)+1;
+      F_temp.row(i*4+2) << (i*4)+3, (i*4)+2, (i*4)+0;
+      F_temp.row(i*4+3) << (i*4)+1, (i*4)+2, (i*4)+3;
+    }
+
+    viewer.clear_mesh();
+    viewer.set_mesh(V_temp,F_temp);
+    viewer.options.face_based = true;
+  }
+
+
+  return false;
+}
+
 int main(int argc, char *argv[])
 {
   using namespace Eigen;
@@ -18,14 +63,16 @@ int main(int argc, char *argv[])
 
   // Load a surface mesh
   igl::readOFF("../shared/fertility.off",V,F);
-  
+
   // Tetrahedralize the interior
   igl::tetrahedralize(V,F,"pq1.414", TV,TT,TF);
 
-  // Compute berycenters
-  
+  // Compute barycenters
+  igl::barycenter(TV,TT,B);
+
   // Plot the generated mesh
   igl::Viewer viewer;
-  viewer.set_mesh(V,F);
+  viewer.callback_key_down = &key_down;
+  key_down(viewer,'5',0);
   viewer.launch();
 }