diff --git a/Point_set_shape_detection_3/include/CGAL/Plane_regularization.h b/Point_set_shape_detection_3/include/CGAL/Plane_regularization.h index b9d28a927c9..868a515c1da 100644 --- a/Point_set_shape_detection_3/include/CGAL/Plane_regularization.h +++ b/Point_set_shape_detection_3/include/CGAL/Plane_regularization.h @@ -157,159 +157,8 @@ namespace CGAL { //find subgraphs of mutually orthogonal clusters (store index of //clusters in subgraph_clusters), and select the cluster of //largest area - std::vector < std::vector < int > > subgraph_clusters; - std::vector < int > subgraph_clusters_max_area_index; - - for (std::size_t i = 0; i < clusters.size(); ++ i) - clusters[i].is_free = true; - - for (std::size_t i = 0; i < clusters.size(); ++ i) - { - if(clusters[i].is_free) - { - clusters[i].is_free = false; - double max_area = clusters[i].area; - int index_max_area = i; - - //initialization containers - std::vector < int > index_container; - index_container.push_back(i); - std::vector < int > index_container_former_ring; - index_container_former_ring.push_back(i); - std::list < int > index_container_current_ring; - - //propagation - bool propagation=true; - do - { - propagation=false; - - //neighbors - for (std::size_t k=0;k::iterator it = index_container_current_ring.begin(); - it != index_container_current_ring.end(); ++it) - { - index_container_former_ring.push_back(*it); - index_container.push_back(*it); - } - index_container_current_ring.clear(); - - } - while(propagation); - subgraph_clusters.push_back(index_container); - subgraph_clusters_max_area_index.push_back(index_max_area); - } - } - - - //create subgraphs of mutually orthogonal clusters in which the - //largest cluster is excluded and store in - //subgraph_clusters_prop - std::vector < std::vector < int > > subgraph_clusters_prop; - for (std::size_t i=0;i subgraph_clusters_prop_temp; - for (std::size_t j=0;j index_container; - index_container.push_back(index_current); - std::vector < int > index_container_former_ring; - index_container_former_ring.push_back(index_current); - std::list < int > index_container_current_ring; - - //propagation - bool propagation=true; - do - { - propagation=false; - - //neighbors - for (std::size_t k=0;k::iterator it = index_container_current_ring.begin(); - it != index_container_current_ring.end(); ++it) - { - index_container_former_ring.push_back(*it); - index_container.push_back(*it); - } - index_container_current_ring.clear(); - }while(propagation); - } - - - + subgraph_mutually_orthogonal_clusters (clusters); + //recompute optimal plane for each primitive after normal regularization for (std::size_t i=0; i < clusters.size(); ++ i) { @@ -325,18 +174,13 @@ namespace CGAL { Plane plane_reg(pt_reg,vec_reg); if( std::fabs(m_planes[index_prim]->plane_normal () * plane_reg.orthogonal_vector ()) > 1. - epsilon) - { - m_planes[index_prim]->update (plane_reg); - } + m_planes[index_prim]->update (plane_reg); } } - - - //detecting co-planarity and store in list_coplanar_prim - std::vector< std::vector< std::vector < int > > > list_coplanar_prim; + std::vector > > list_coplanar_prim; for (std::size_t i = 0; i < clusters.size(); ++ i) { @@ -387,7 +231,7 @@ namespace CGAL { - //regularize primitive position by computing barycenter of coplanar planes + //regularize primitive position by computing barycenter of cplanar planes std::vector < std::vector < int > > list_primitive_reg_index_extracted_planes; std::vector < Plane > list_primitive_reg; @@ -442,15 +286,8 @@ namespace CGAL { // std::cout<& clusters) + { + std::vector < std::vector < int > > subgraph_clusters; + std::vector < int > subgraph_clusters_max_area_index; + + for (std::size_t i = 0; i < clusters.size(); ++ i) + clusters[i].is_free = true; + + for (std::size_t i = 0; i < clusters.size(); ++ i) + { + if(clusters[i].is_free) + { + clusters[i].is_free = false; + double max_area = clusters[i].area; + int index_max_area = i; + + //initialization containers + std::vector < int > index_container; + index_container.push_back(i); + std::vector < int > index_container_former_ring; + index_container_former_ring.push_back(i); + std::list < int > index_container_current_ring; + + //propagation + bool propagation=true; + do + { + propagation=false; + + //neighbors + for (std::size_t k=0;k::iterator it = index_container_current_ring.begin(); + it != index_container_current_ring.end(); ++it) + { + index_container_former_ring.push_back(*it); + index_container.push_back(*it); + } + index_container_current_ring.clear(); + + } + while(propagation); + subgraph_clusters.push_back(index_container); + subgraph_clusters_max_area_index.push_back(index_max_area); + } + } + + + //create subgraphs of mutually orthogonal clusters in which the + //largest cluster is excluded and store in + //subgraph_clusters_prop + std::vector < std::vector < int > > subgraph_clusters_prop; + for (std::size_t i=0;i subgraph_clusters_prop_temp; + for (std::size_t j=0;j index_container; + index_container.push_back(index_current); + std::vector < int > index_container_former_ring; + index_container_former_ring.push_back(index_current); + std::list < int > index_container_current_ring; + + //propagation + bool propagation=true; + do + { + propagation=false; + + //neighbors + for (std::size_t k=0;k::iterator it = index_container_current_ring.begin(); + it != index_container_current_ring.end(); ++it) + { + index_container_former_ring.push_back(*it); + index_container.push_back(*it); + } + index_container_current_ring.clear(); + }while(propagation); + } + std::cerr << subgraph_clusters.size () << " subgraph clusters" << std::endl; + for (std::size_t i = 0; i < subgraph_clusters.size (); ++ i) + std::cerr << subgraph_clusters[i].size () << " "; + std::cerr << std::endl; + std::cerr << subgraph_clusters_max_area_index.size () << " subgraph clusters max area index" << std::endl + << subgraph_clusters_prop.size () << " subgraph clusters prop" << std::endl; + for (std::size_t i = 0; i < subgraph_clusters_prop.size (); ++ i) + std::cerr << subgraph_clusters_prop[i].size () << " "; + std::cerr << std::endl; + } FT distance_Point (const Point& a, const Point& b)