Bläddra i källkod

csg tree tutorial entry

Former-commit-id: 6dc99854569e7090c378a8a41ecb9d33f9940512
Alec Jacobson 9 år sedan
förälder
incheckning
13212cb389

+ 32 - 0
tutorial/610_CSGTree/CMakeLists.txt

@@ -0,0 +1,32 @@
+cmake_minimum_required(VERSION 2.6)
+project(610_Boolean)
+
+find_package(CGAL REQUIRED)
+include(${CGAL_USE_FILE})
+# CGAL's monkeying with all of the flags. Rather than change the CGAL_USE_FILE
+# just get ride of this flag.
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+  remove_cxx_flag("-stdlib=libc++")
+endif()
+IF(MSVC)
+  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") ### Enable parallel compilation for Visual Studio
+  SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR} )
+  SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR} )
+ELSE(MSVC)
+  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") #### Libigl requires a modern C++ compiler that supports c++11
+  SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../" )
+ENDIF(MSVC)
+
+# This is absolutely necessary for Exact Construction
+
+# for some reason must come after cgal include. I think that it's overwriting
+# come flags like CXX_FLAGS
+#set(CMAKELISTS_SHARED_INCLUDED FALSE)
+include("../CMakeLists.shared")
+
+set(SOURCES
+${PROJECT_SOURCE_DIR}/main.cpp
+)
+
+add_executable(${PROJECT_NAME}_bin ${SOURCES} ${SHARED_SOURCES})
+target_link_libraries(${PROJECT_NAME}_bin ${SHARED_LIBRARIES} ${CGAL_LIBRARIES})

+ 123 - 0
tutorial/610_CSGTree/main.cpp

@@ -0,0 +1,123 @@
+#include <igl/read_triangle_mesh.h>
+#include <igl/boolean/CSGTree.h>
+#include <igl/viewer/Viewer.h>
+#include <igl/jet.h>
+#include <Eigen/Core>
+
+int main(int argc, char * argv[])
+{
+  using namespace Eigen;
+  using namespace igl::boolean;
+  using namespace std;
+  using namespace igl;
+  MatrixXi FA,FB,FC,FD,FE;
+  MatrixXd VA,VB,VC,VD,VE;
+  // Read in inputs as double precision floating point meshes
+  read_triangle_mesh(     "cube.obj",VA,FA);
+  read_triangle_mesh(   "sphere.obj",VB,FB);
+  read_triangle_mesh("xcylinder.obj",VC,FC);
+  read_triangle_mesh("ycylinder.obj",VD,FD);
+  read_triangle_mesh("zcylinder.obj",VE,FE);
+  igl::viewer::Viewer viewer;
+
+  int num_views = 5+4;
+  int view_id = num_views-1;
+  const auto & update = [&]()
+  {
+    viewer.data.clear();
+    // CSGTree templated on type of F
+    typedef CSGTree<MatrixXi> CSGTreei;
+    VectorXd I;
+    const auto & set_mesh = 
+      [&](const MatrixXd & V, const MatrixXi & F, const int i)
+    {
+      viewer.data.set_mesh(V,F);
+      I = VectorXd::Constant(F.rows(),1,i);
+    };
+    switch(view_id)
+    {
+      case 0:
+        set_mesh(VA,FA,5);
+        break;
+      case 1:
+        set_mesh(VB,FB,4);
+        break;
+      case 2:
+        set_mesh(VC,FC,3);
+        break;
+      case 3:
+        set_mesh(VD,FD,2);
+        break;
+      case 4:
+        set_mesh(VE,FE,1);
+        break;
+      default:
+      {
+        CSGTreei M;
+        Matrix<long int,Dynamic,1> J;
+        switch(view_id)
+        {
+          case 5:
+            // Compute result of (A ∩ B)
+            M = {{VA,FA},{VB,FB},"i"};
+            J = M.J().array()+0;
+            break;
+          case 6:
+            // Compute result of (C ∪ D)
+            M = {{VC,FC},{VD,FD},"u"};
+            J = M.J().array()+FA.rows()+FB.rows();
+            break;
+          case 7:
+            // Compute result of (C ∪ D) ∪ E
+            M = {{{VC,FC},{VD,FD},"u"},{VE,FE},"u"};
+            J = M.J().array()+FA.rows()+FB.rows();
+            break;
+          case 8:
+            // Compute result of (A ∩ B) \ ((C ∪ D) ∪ E)
+            M = {{{VA,FA},{VB,FB},"i"},{{{VC,FC},{VD,FD},"u"},{VE,FE},"u"},"m"};
+            J = M.J().array()+0;
+            break;
+          default:
+            assert(false && "unknown view id");
+        }
+        viewer.data.set_mesh(M.cast_V<MatrixXd>(),M.F());
+        I.resize(M.F().rows(),1);
+        // Compute colors based on original facets
+        for(int f = 0;f<M.F().rows();f++)
+        {
+          const int j = J(f);
+          I(f) = 
+            (int)(j<FA.rows())+
+            (int)(j<FA.rows()+FB.rows())+
+            (int)(j<FA.rows()+FB.rows()+FC.rows())+
+            (int)(j<FA.rows()+FB.rows()+FC.rows()+FD.rows())+
+            (int)(j<FA.rows()+FB.rows()+FC.rows()+FD.rows()+FE.rows());
+        }
+      }
+    }
+
+    MatrixXd C;
+    jet(I,1,5,C);
+    viewer.data.set_colors(C);
+  };
+  update();
+
+  viewer.callback_key_down = 
+    [&](igl::viewer::Viewer &viewer, unsigned char key, int mods)->bool
+    {
+      switch(key)
+      {
+        case ']':
+          view_id = (view_id+1)%num_views;
+          break;
+        case '[':
+          view_id = (view_id+num_views-1)%num_views;
+          break;
+        default:
+          return false;
+      }
+      update();
+      return true;
+    };
+  viewer.launch();
+}

+ 1 - 0
tutorial/CMakeLists.txt

@@ -142,6 +142,7 @@ if(LIM_FOUND)
 endif(LIM_FOUND)
 if(CGAL_FOUND)
   add_subdirectory("609_Boolean")
+  add_subdirectory("610_Boolean")
 endif()
 add_subdirectory("701_Statistics")
 add_subdirectory("702_WindingNumber")

+ 1 - 1
tutorial/tutorial.html.REMOVED.git-id

@@ -1 +1 @@
-76a3c2f5ee343b08f1160182591a08472860030e
+53bc74ee5260d15e2e091e1db91960956f00f87a

+ 1 - 1
tutorial/tutorial.md.REMOVED.git-id

@@ -1 +1 @@
-5fc7b26c782211bff5326b46b3eda0806a2aca0a
+b503df846aa946fec3c9a0e36617718d3a13ae3f