From adde363ada3fc775887a6abc72c3e69f0185c6e6 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 8 Mar 2017 17:38:39 +0100 Subject: [PATCH] Make the computation of the kernel of a Surface_mesh work --- .../CGAL/boost/graph/copy_face_graph.h | 3 - .../Plugins/Convex_hull/CMakeLists.txt | 2 +- .../Plugins/Convex_hull/Kernel_plugin.cpp | 101 ++++++++++++++---- .../include/CGAL/Polyhedron_kernel.h | 28 ++--- 4 files changed, 95 insertions(+), 39 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/copy_face_graph.h b/BGL/include/CGAL/boost/graph/copy_face_graph.h index 349af2f93b1..655a0d9d564 100644 --- a/BGL/include/CGAL/boost/graph/copy_face_graph.h +++ b/BGL/include/CGAL/boost/graph/copy_face_graph.h @@ -105,7 +105,6 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, put(tm_vpm, tm_h_src, conv(get(sm_vpm, sm_h_src))); } } - //create faces and connect halfedges BOOST_FOREACH(sm_face_descriptor sm_f, faces(sm)) { @@ -125,7 +124,6 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, tm_h_prev=tm_h; } } - // update next/prev of tm border halfedges by visiting faces of the mesh BOOST_FOREACH(tm_halfedge_descriptor h, tm_border_halfedges) { @@ -136,7 +134,6 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, while( !is_border(candidate, tm) ); set_next(h, candidate, tm); } - // update halfedge vertex of all but the vertex halfedge BOOST_FOREACH(tm_vertex_descriptor v, vertices(tm)) { diff --git a/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/CMakeLists.txt index 938d32f34c8..d2b509ec933 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/CMakeLists.txt @@ -3,4 +3,4 @@ include( polyhedron_demo_macros ) polyhedron_demo_plugin(convex_hull_plugin Convex_hull_plugin) target_link_libraries(convex_hull_plugin scene_polyhedron_item scene_points_with_normal_item scene_polylines_item scene_polyhedron_selection_item) polyhedron_demo_plugin(kernel_plugin Kernel_plugin) -target_link_libraries(kernel_plugin scene_polyhedron_item) \ No newline at end of file +target_link_libraries(kernel_plugin scene_polyhedron_item scene_surface_mesh_item) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/Kernel_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/Kernel_plugin.cpp index 370f5f805f5..4fbb358f3d5 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/Kernel_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/Kernel_plugin.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -5,6 +6,7 @@ #include #include "Scene_polyhedron_item.h" +#include "Scene_surface_mesh_item.h" #include "Polyhedron_type.h" #include @@ -13,6 +15,8 @@ #include #include #include +#include +#include #include "Kernel_type.h" typedef Kernel::Triangle_3 Triangle; @@ -35,7 +39,8 @@ public: } bool applicable(QAction*) const { - return qobject_cast(scene->item(scene->mainSelectionIndex())); + return qobject_cast(scene->item(scene->mainSelectionIndex())) || + qobject_cast(scene->item(scene->mainSelectionIndex())); } void init(QMainWindow* mainWindow, CGAL::Three::Scene_interface* scene_interface, Messages_interface*) @@ -64,18 +69,25 @@ void Polyhedron_demo_kernel_plugin::on_actionKernel_triggered() Scene_polyhedron_item* item = qobject_cast(scene->item(index)); - if(item) + Scene_surface_mesh_item* sm_item = + qobject_cast(scene->item(index)); + + if(item || sm_item) { QApplication::setOverrideCursor(Qt::WaitCursor); - Polyhedron* pMesh = item->polyhedron(); + Polyhedron* pMesh = (item)?item->polyhedron():NULL; + Scene_surface_mesh_item::SMesh* sMesh = (sm_item)?sm_item->polyhedron():NULL; typedef CGAL::Exact_rational ET; typedef Polyhedron_kernel Polyhedron_kernel; // get triangles from polyhedron std::list triangles; - get_triangles(*pMesh,std::back_inserter(triangles)); - + if(pMesh){ + get_triangles(*pMesh,std::back_inserter(triangles)); + } else { + get_triangles(*sMesh,std::back_inserter(triangles)); + } // solve LP std::cout << "Solve linear program..." << triangles.size(); Polyhedron_kernel kernel; @@ -90,9 +102,6 @@ void Polyhedron_demo_kernel_plugin::on_actionKernel_triggered() } std::cout << "done" << std::endl; - // add kernel as new polyhedron - Polyhedron *pKernel = new Polyhedron; - // get inside point Point inside_point = kernel.inside_point(); Vector translate = inside_point - CGAL::ORIGIN; @@ -125,21 +134,71 @@ void Polyhedron_demo_kernel_plugin::on_actionKernel_triggered() CGAL::convex_hull_3(dual_points.begin(),dual_points.end(),convex_hull); std::cout << "ok" << std::endl; - // dualize and translate back to get final kernel - Dualizer dualizer; - dualizer.run(convex_hull,*pKernel); - ::translate(*pKernel,translate); - pKernel->inside_out(); + if(pMesh){ + // add kernel as new polyhedron + Polyhedron *pKernel = new Polyhedron; + + // dualize and translate back to get final kernel + Dualizer dualizer; + dualizer.run(convex_hull,*pKernel); + ::translate(*pKernel,translate); + pKernel->inside_out(); + + Scene_polyhedron_item* new_item = new Scene_polyhedron_item(pKernel); + new_item->setName(tr("%1 (kernel)").arg(item->name())); + new_item->setColor(Qt::magenta); + new_item->setRenderingMode(item->renderingMode()); + item->setRenderingMode(Wireframe); + + scene->addItem(new_item); + scene->itemChanged(item); + } else { // sMesh + // add kernel as new polyhedron + typedef Scene_surface_mesh_item::SMesh SMesh; + SMesh* pKernel = new SMesh; + + typedef CGAL::Dual Dual; + typedef boost::graph_traits::face_descriptor dual_face_descriptor; + typedef boost::graph_traits::vertex_descriptor dual_vertex_descriptor; - Scene_polyhedron_item* new_item = new Scene_polyhedron_item(pKernel); - new_item->setName(tr("%1 (kernel)").arg(item->name())); - new_item->setColor(Qt::magenta); - new_item->setRenderingMode(item->renderingMode()); - item->setRenderingMode(Wireframe); - - scene->addItem(new_item); - scene->itemChanged(item); + std::ofstream out("primal.off"); + out << convex_hull << std::endl; + out.close(); + Dual dual(convex_hull); + + std::map vpm; + BOOST_FOREACH(boost::graph_traits::face_descriptor fd, faces(convex_hull)){ + Point points[3]; + int i = 0; + BOOST_FOREACH(boost::graph_traits::vertex_descriptor vd, + vertices_around_face(halfedge(fd,convex_hull),convex_hull)){ + points[i++] = get(CGAL::vertex_point,convex_hull,vd); + } + Plane plane(points[0],points[1],points[2]); + FT sqd = CGAL::squared_distance(Point(CGAL::ORIGIN),plane); + FT distance_to_origin = std::sqrt(sqd); + Vector normal = plane.orthogonal_vector(); + normal = normal / std::sqrt(normal * normal); + vpm[fd] = CGAL::ORIGIN + normal / distance_to_origin + translate; + } + CGAL::copy_face_graph(dual, *pKernel, + CGAL::Emptyset_iterator(), + CGAL::Emptyset_iterator(), + CGAL::Emptyset_iterator(), + boost::make_assoc_property_map(vpm)); + + // pKernel->inside_out(); + + Scene_surface_mesh_item* new_item = new Scene_surface_mesh_item(pKernel); + new_item->setName(tr("%1 (kernel)").arg(sm_item->name())); + new_item->setColor(Qt::magenta); + new_item->setRenderingMode(sm_item->renderingMode()); + sm_item->setRenderingMode(Wireframe); + + scene->addItem(new_item); + scene->itemChanged(sm_item); + } QApplication::restoreOverrideCursor(); } } diff --git a/Polyhedron/demo/Polyhedron/include/CGAL/Polyhedron_kernel.h b/Polyhedron/demo/Polyhedron/include/CGAL/Polyhedron_kernel.h index c0f023fcb3c..56c73cf052e 100644 --- a/Polyhedron/demo/Polyhedron/include/CGAL/Polyhedron_kernel.h +++ b/Polyhedron/demo/Polyhedron/include/CGAL/Polyhedron_kernel.h @@ -161,19 +161,19 @@ template void get_triangles(Polyhedron& polyhedron, OutputIterator out) { - typedef typename Polyhedron::Facet_iterator Facet_iterator; - typedef typename Polyhedron::Halfedge_handle Halfedge_handle; - typedef typename Polyhedron::Point_3 Point; - typedef typename Polyhedron::Traits::Triangle_3 Triangle; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::property_map::type VPmap; + typedef typename boost::property_traits::value_type Point; + typedef typename CGAL::Kernel_traits::Kernel::Triangle_3 Triangle; - for(Facet_iterator f = polyhedron.facets_begin(); - f != polyhedron.facets_end(); - f++) - { - Halfedge_handle he = f->halfedge(); - const Point& a = he->vertex()->point(); - const Point& b = he->next()->vertex()->point(); - const Point& c = he->next()->next()->vertex()->point(); - *out++ = Triangle(a,b,c); - } + VPmap vpmap = get(CGAL::vertex_point,polyhedron); + BOOST_FOREACH(face_descriptor fd, faces(polyhedron)){ + Point points[3]; + int i = 0; + BOOST_FOREACH(vertex_descriptor vd, vertices_around_face(halfedge(fd,polyhedron),polyhedron)){ + points[i++] = get(vpmap,vd); + } + *out++ = Triangle(points[0],points[1], points[2]); + } }