mirror of https://github.com/CGAL/cgal
Ok for Surface_mesh_skeletonization for BGL LCC
This commit is contained in:
parent
d7e40dc40d
commit
73adec542f
|
|
@ -26,8 +26,10 @@ if ( CGAL_FOUND )
|
||||||
|
|
||||||
create_single_source_cgal_program( "simple_mcfskel_example.cpp" )
|
create_single_source_cgal_program( "simple_mcfskel_example.cpp" )
|
||||||
create_single_source_cgal_program( "simple_mcfskel_sm_example.cpp" )
|
create_single_source_cgal_program( "simple_mcfskel_sm_example.cpp" )
|
||||||
|
create_single_source_cgal_program( "simple_mcfskel_LCC_example.cpp" )
|
||||||
create_single_source_cgal_program( "MCF_Skeleton_example.cpp" )
|
create_single_source_cgal_program( "MCF_Skeleton_example.cpp" )
|
||||||
create_single_source_cgal_program( "MCF_Skeleton_sm_example.cpp" )
|
create_single_source_cgal_program( "MCF_Skeleton_sm_example.cpp" )
|
||||||
|
create_single_source_cgal_program( "MCF_Skeleton_LCC_example.cpp" )
|
||||||
create_single_source_cgal_program( "segmentation_example.cpp" )
|
create_single_source_cgal_program( "segmentation_example.cpp" )
|
||||||
else()
|
else()
|
||||||
message(STATUS "These programs require the Eigen library (3.2 or greater), and will not be compiled.")
|
message(STATUS "These programs require the Eigen library (3.2 or greater), and will not be compiled.")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
#include <CGAL/Linear_cell_complex_for_combinatorial_map.h>
|
||||||
|
#include <CGAL/Linear_cell_complex_incremental_builder_v2.h>
|
||||||
|
#include <CGAL/boost/graph/graph_traits_Linear_cell_complex.h>
|
||||||
|
#include <CGAL/Simple_cartesian.h>
|
||||||
|
#include <CGAL/Mean_curvature_flow_skeletonization.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
typedef CGAL::Simple_cartesian<double> Kernel;
|
||||||
|
typedef Kernel::Point_3 Point;
|
||||||
|
|
||||||
|
typedef CGAL::Linear_cell_complex_traits<3, Kernel> MyTraits;
|
||||||
|
|
||||||
|
struct Myitem
|
||||||
|
{
|
||||||
|
template<class Refs>
|
||||||
|
struct Dart_wrapper
|
||||||
|
{
|
||||||
|
typedef CGAL::Tag_true Darts_with_id;
|
||||||
|
typedef CGAL::Cell_attribute_with_point_and_id< Refs > Vertex_attribute;
|
||||||
|
typedef CGAL::Cell_attribute_with_id< Refs > Face_attribute;
|
||||||
|
typedef CGAL::cpp11::tuple<Vertex_attribute, void, Face_attribute> Attributes;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef CGAL::Linear_cell_complex_for_combinatorial_map<2, 3, MyTraits, Myitem> LCC;
|
||||||
|
typedef boost::graph_traits<LCC>::vertex_descriptor vertex_descriptor;
|
||||||
|
|
||||||
|
typedef CGAL::Mean_curvature_flow_skeletonization<LCC> Skeletonization;
|
||||||
|
typedef Skeletonization::Skeleton Skeleton;
|
||||||
|
|
||||||
|
typedef Skeleton::vertex_descriptor Skeleton_vertex;
|
||||||
|
typedef Skeleton::edge_descriptor Skeleton_edge;
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
LCC lcc;
|
||||||
|
CGAL::load_off_v2(lcc, "data/elephant.off");
|
||||||
|
|
||||||
|
Skeleton skeleton;
|
||||||
|
Skeletonization mcs(lcc);
|
||||||
|
|
||||||
|
// 1. Contract the mesh by mean curvature flow.
|
||||||
|
mcs.contract_geometry();
|
||||||
|
|
||||||
|
// 2. Collapse short edges and split bad triangles.
|
||||||
|
mcs.collapse_edges();
|
||||||
|
mcs.split_faces();
|
||||||
|
|
||||||
|
// 3. Fix degenerate vertices.
|
||||||
|
mcs.detect_degeneracies();
|
||||||
|
|
||||||
|
// Perform the above three steps in one iteration.
|
||||||
|
mcs.contract();
|
||||||
|
|
||||||
|
// Iteratively apply step 1 to 3 until convergence.
|
||||||
|
mcs.contract_until_convergence();
|
||||||
|
|
||||||
|
// Convert the contracted mesh into a curve skeleton and
|
||||||
|
// get the correspondent surface points
|
||||||
|
mcs.convert_to_skeleton(skeleton);
|
||||||
|
|
||||||
|
std::cout << "Number of vertices of the skeleton: " << boost::num_vertices(skeleton) << "\n";
|
||||||
|
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
||||||
|
|
||||||
|
// Output all the edges of the skeleton.
|
||||||
|
std::ofstream output("skel-lcc.cgal");
|
||||||
|
BOOST_FOREACH(Skeleton_edge e, edges(skeleton))
|
||||||
|
{
|
||||||
|
const Point& s = skeleton[source(e, skeleton)].point;
|
||||||
|
const Point& t = skeleton[target(e, skeleton)].point;
|
||||||
|
output << "2 "<< s << " " << t << "\n";
|
||||||
|
}
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
// Output skeleton points and the corresponding surface points
|
||||||
|
output.open("correspondance-lcc.cgal");
|
||||||
|
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
||||||
|
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
||||||
|
output << "2 " << skeleton[v].point << " " << get(CGAL::vertex_point, lcc, vd) << "\n";
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -52,7 +52,7 @@ int main(int argc, char* argv[])
|
||||||
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
||||||
|
|
||||||
// Output all the edges of the skeleton.
|
// Output all the edges of the skeleton.
|
||||||
std::ofstream output("skel.cgal");
|
std::ofstream output("skel-poly.cgal");
|
||||||
BOOST_FOREACH(Skeleton_edge e, edges(skeleton))
|
BOOST_FOREACH(Skeleton_edge e, edges(skeleton))
|
||||||
{
|
{
|
||||||
const Point& s = skeleton[source(e, skeleton)].point;
|
const Point& s = skeleton[source(e, skeleton)].point;
|
||||||
|
|
@ -62,7 +62,7 @@ int main(int argc, char* argv[])
|
||||||
output.close();
|
output.close();
|
||||||
|
|
||||||
// Output skeleton points and the corresponding surface points
|
// Output skeleton points and the corresponding surface points
|
||||||
output.open("correspondance.cgal");
|
output.open("correspondance-poly.cgal");
|
||||||
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
||||||
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
||||||
output << "2 " << skeleton[v].point << " " << get(CGAL::vertex_point, tmesh, vd) << "\n";
|
output << "2 " << skeleton[v].point << " " << get(CGAL::vertex_point, tmesh, vd) << "\n";
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ int main(int argc, char* argv[])
|
||||||
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
||||||
|
|
||||||
// Output all the edges of the skeleton.
|
// Output all the edges of the skeleton.
|
||||||
std::ofstream output("skel.cgal");
|
std::ofstream output("skel-sm.cgal");
|
||||||
BOOST_FOREACH(Skeleton_edge e, edges(skeleton))
|
BOOST_FOREACH(Skeleton_edge e, edges(skeleton))
|
||||||
{
|
{
|
||||||
const Point& s = skeleton[source(e, skeleton)].point;
|
const Point& s = skeleton[source(e, skeleton)].point;
|
||||||
|
|
@ -61,7 +61,7 @@ int main(int argc, char* argv[])
|
||||||
output.close();
|
output.close();
|
||||||
|
|
||||||
// Output skeleton points and the corresponding surface points
|
// Output skeleton points and the corresponding surface points
|
||||||
output.open("correspondance.cgal");
|
output.open("correspondance-sm.cgal");
|
||||||
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
||||||
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
||||||
output << "2 " << skeleton[v].point << " " << get(CGAL::vertex_point, tmesh, vd) << "\n";
|
output << "2 " << skeleton[v].point << " " << get(CGAL::vertex_point, tmesh, vd) << "\n";
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
#include <CGAL/Simple_cartesian.h>
|
||||||
|
#include <CGAL/Linear_cell_complex_for_combinatorial_map.h>
|
||||||
|
#include <CGAL/Linear_cell_complex_incremental_builder_v2.h>
|
||||||
|
#include <CGAL/boost/graph/graph_traits_Linear_cell_complex.h>
|
||||||
|
#include <CGAL/boost/graph/properties_Linear_cell_complex.h>
|
||||||
|
#include <CGAL/extract_mean_curvature_flow_skeleton.h>
|
||||||
|
#include <CGAL/boost/graph/split_graph_into_polylines.h>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
|
typedef CGAL::Simple_cartesian<double> Kernel;
|
||||||
|
typedef Kernel::Point_3 Point;
|
||||||
|
typedef CGAL::Linear_cell_complex_traits<3, Kernel> MyTraits;
|
||||||
|
|
||||||
|
struct Myitem
|
||||||
|
{
|
||||||
|
template<class Refs>
|
||||||
|
struct Dart_wrapper
|
||||||
|
{
|
||||||
|
typedef CGAL::Tag_true Darts_with_id;
|
||||||
|
typedef CGAL::Cell_attribute_with_point_and_id< Refs > Vertex_attribute;
|
||||||
|
typedef CGAL::Cell_attribute_with_id< Refs > Face_attribute;
|
||||||
|
typedef CGAL::cpp11::tuple<Vertex_attribute, void, Face_attribute> Attributes;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef CGAL::Linear_cell_complex_for_combinatorial_map<2, 3, MyTraits, Myitem> LCC;
|
||||||
|
|
||||||
|
typedef boost::graph_traits<LCC>::vertex_descriptor vertex_descriptor;
|
||||||
|
|
||||||
|
typedef CGAL::Mean_curvature_flow_skeletonization<LCC> Skeletonization;
|
||||||
|
typedef Skeletonization::Skeleton Skeleton;
|
||||||
|
|
||||||
|
typedef Skeleton::vertex_descriptor Skeleton_vertex;
|
||||||
|
typedef Skeleton::edge_descriptor Skeleton_edge;
|
||||||
|
|
||||||
|
//only needed for the display of the skeleton as maximal polylines
|
||||||
|
struct Display_polylines{
|
||||||
|
const Skeleton& skeleton;
|
||||||
|
std::ofstream& out;
|
||||||
|
int polyline_size;
|
||||||
|
std::stringstream sstr;
|
||||||
|
|
||||||
|
Display_polylines(const Skeleton& skeleton, std::ofstream& out)
|
||||||
|
: skeleton(skeleton), out(out)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void start_new_polyline(){
|
||||||
|
polyline_size=0;
|
||||||
|
sstr.str("");
|
||||||
|
sstr.clear();
|
||||||
|
}
|
||||||
|
void add_node(Skeleton_vertex v){
|
||||||
|
++polyline_size;
|
||||||
|
sstr << " " << skeleton[v].point;
|
||||||
|
}
|
||||||
|
void end_polyline()
|
||||||
|
{
|
||||||
|
out << polyline_size << sstr.str() << "\n";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// This example extracts a medially centered skeleton from a given mesh.
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
LCC lcc;
|
||||||
|
CGAL::load_off_v2(lcc, "data/elephant.off");
|
||||||
|
|
||||||
|
Skeleton skeleton;
|
||||||
|
|
||||||
|
CGAL::extract_mean_curvature_flow_skeleton(lcc, skeleton);
|
||||||
|
|
||||||
|
std::cout << "Number of vertices of the skeleton: " << boost::num_vertices(skeleton) << "\n";
|
||||||
|
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
||||||
|
|
||||||
|
// Output all the edges of the skeleton.
|
||||||
|
std::ofstream output("skel-lcc.cgal");
|
||||||
|
Display_polylines display(skeleton,output);
|
||||||
|
CGAL::split_graph_into_polylines(skeleton, display);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
// Output skeleton points and the corresponding surface points
|
||||||
|
output.open("correspondance-lcc.cgal");
|
||||||
|
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
||||||
|
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
||||||
|
output << "2 " << skeleton[v].point << " "
|
||||||
|
<< get(CGAL::vertex_point, lcc, vd) << "\n";
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -62,13 +62,13 @@ int main(int argc, char* argv[])
|
||||||
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
||||||
|
|
||||||
// Output all the edges of the skeleton.
|
// Output all the edges of the skeleton.
|
||||||
std::ofstream output("skel.cgal");
|
std::ofstream output("skel-poly.cgal");
|
||||||
Display_polylines display(skeleton,output);
|
Display_polylines display(skeleton,output);
|
||||||
CGAL::split_graph_into_polylines(skeleton, display);
|
CGAL::split_graph_into_polylines(skeleton, display);
|
||||||
output.close();
|
output.close();
|
||||||
|
|
||||||
// Output skeleton points and the corresponding surface points
|
// Output skeleton points and the corresponding surface points
|
||||||
output.open("correspondance.cgal");
|
output.open("correspondance-poly.cgal");
|
||||||
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
||||||
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
||||||
output << "2 " << skeleton[v].point << " "
|
output << "2 " << skeleton[v].point << " "
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ int main(int argc, char* argv[])
|
||||||
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
std::cout << "Number of edges of the skeleton: " << boost::num_edges(skeleton) << "\n";
|
||||||
|
|
||||||
// Output all the edges of the skeleton.
|
// Output all the edges of the skeleton.
|
||||||
std::ofstream output("skel.cgal");
|
std::ofstream output("skel-sm.cgal");
|
||||||
BOOST_FOREACH(Skeleton_edge e, edges(skeleton))
|
BOOST_FOREACH(Skeleton_edge e, edges(skeleton))
|
||||||
{
|
{
|
||||||
const Point& s = skeleton[source(e, skeleton)].point;
|
const Point& s = skeleton[source(e, skeleton)].point;
|
||||||
|
|
@ -46,7 +46,7 @@ int main(int argc, char* argv[])
|
||||||
output.close();
|
output.close();
|
||||||
|
|
||||||
// Output skeleton points and the corresponding surface points
|
// Output skeleton points and the corresponding surface points
|
||||||
output.open("correspondance.cgal");
|
output.open("correspondance-sm.cgal");
|
||||||
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
BOOST_FOREACH(Skeleton_vertex v, vertices(skeleton))
|
||||||
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
BOOST_FOREACH(vertex_descriptor vd, skeleton[v].vertices)
|
||||||
output << "2 " << skeleton[v].point << " " << get(CGAL::vertex_point, tmesh, vd) << "\n";
|
output << "2 " << skeleton[v].point << " " << get(CGAL::vertex_point, tmesh, vd) << "\n";
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,15 @@ Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_l
|
||||||
|
|
||||||
./Surface_mesh_segmentation/examples/Surface_mesh_segmentation/segmentation_from_sdf_values_LCC_example.cpp
|
./Surface_mesh_segmentation/examples/Surface_mesh_segmentation/segmentation_from_sdf_values_LCC_example.cpp
|
||||||
|
|
||||||
|
./Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/MCF_Skeleton_LCC_example.cpp
|
||||||
|
./Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/simple_mcfskel_LCC_example.cpp
|
||||||
|
|
||||||
|
Les 3 versions donnent un résultat différent !!
|
||||||
|
|
||||||
=============================================
|
=============================================
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
./Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_LCC.cpp
|
./Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_LCC.cpp
|
||||||
|
|
||||||
Compile pas
|
Compile pas
|
||||||
|
|
@ -30,8 +37,3 @@ Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_l
|
||||||
Compile pas
|
Compile pas
|
||||||
|
|
||||||
=============================================
|
=============================================
|
||||||
|
|
||||||
TODO
|
|
||||||
|
|
||||||
./Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/MCF_Skeleton_sm_example.cpp
|
|
||||||
./Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/simple_mcfskel_sm_example.cpp
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue