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 d20abcacf9f..bdd34a4cd6d 100644 --- a/Point_set_shape_detection_3/include/CGAL/Plane_regularization.h +++ b/Point_set_shape_detection_3/include/CGAL/Plane_regularization.h @@ -151,18 +151,22 @@ namespace CGAL { // find pairs of epsilon-parallel primitives and store them in table_parallel std::vector < std::vector < bool > > table_parallel; - for( std::size_t i=0;i table_parallel_tmp; - for( std::size_t j=0;j table_parallel_tmp; + for( std::size_t j=0;j1.-epsilon && i!=j) table_parallel_tmp.push_back(true); - else table_parallel_tmp.push_back(false); + if (std::fabs(v1*v2)>1.-epsilon && i!=j) + table_parallel_tmp.push_back(true); + else + table_parallel_tmp.push_back(false); + } + table_parallel.push_back(table_parallel_tmp); } - table_parallel.push_back(table_parallel_tmp); - } @@ -172,81 +176,110 @@ namespace CGAL { std::vector < Vector > list_cluster_normales; std::vector < double > list_cluster_cosangle_vertical; std::vector < double > list_cluster_area; - std::vector < bool > is_available; for( std::size_t i=0;i is_available; + for( std::size_t i=0;i index_container_parallel; index_container_parallel.push_back(i); - std::vector < int > index_container_former_ring_parallel; index_container_former_ring_parallel.push_back(i); - std::list < int > index_container_current_ring_parallel; + //initialization containers + std::vector < int > index_container_parallel; + index_container_parallel.push_back(i); + + std::vector < int > index_container_former_ring_parallel; + index_container_former_ring_parallel.push_back(i); + + std::list < int > index_container_current_ring_parallel; - //propagation over the pairs of epsilon-parallel primitives - bool propagation=true; - Vector cluster_normal=extracted_planes[i].orthogonal_vector(); - double cumulated_area=list_areas[i]; + //propagation over the pairs of epsilon-parallel primitives + bool propagation=true; + Vector cluster_normal=extracted_planes[i].orthogonal_vector(); + double cumulated_area=list_areas[i]; - do{ - propagation=false; + do + { + propagation=false; - for (std::size_t k=0;k1.-epsilon ){ + if( table_parallel[plane_index][it] && is_available[it] + && std::fabs(normal_it*cluster_normal)>1.-epsilon ) + { - propagation=true; - index_container_current_ring_parallel.push_back(it); - is_available[it]=false; + propagation=true; + index_container_current_ring_parallel.push_back(it); + is_available[it]=false; - if(cluster_normal*normal_it <0) normal_it=-normal_it; - cluster_normal=(FT)cumulated_area*cluster_normal+(FT)list_areas[it]*normal_it; - FT norm=1./sqrt(cluster_normal.squared_length()); - cluster_normal=norm*cluster_normal; - cumulated_area+=list_areas[it]; - } - } - } + if(cluster_normal*normal_it <0) + normal_it=-normal_it; + + cluster_normal=(FT)cumulated_area*cluster_normal+(FT)list_areas[it]*normal_it; + FT norm=1./sqrt(cluster_normal.squared_length()); + cluster_normal=norm*cluster_normal; + cumulated_area+=list_areas[it]; + } + } + } - //update containers - index_container_former_ring_parallel.clear(); - for(std::list < int >::iterator it = index_container_current_ring_parallel.begin(); it != index_container_current_ring_parallel.end(); ++it){ - index_container_former_ring_parallel.push_back(*it); - index_container_parallel.push_back(*it); - } - index_container_current_ring_parallel.clear(); + //update containers + index_container_former_ring_parallel.clear(); + for (std::list < int >::iterator it = index_container_current_ring_parallel.begin(); + it != index_container_current_ring_parallel.end(); ++it) + { + index_container_former_ring_parallel.push_back(*it); + index_container_parallel.push_back(*it); + } + index_container_current_ring_parallel.clear(); - }while(propagation); + } + while(propagation); - list_parallel_planes.push_back(index_container_parallel); - list_cluster_normales.push_back(cluster_normal); - list_cluster_area.push_back(cumulated_area); - Vector v_vertical(0.,0.,1.); - list_cluster_cosangle_vertical.push_back(std::fabs(v_vertical*cluster_normal)); + list_parallel_planes.push_back(index_container_parallel); + list_cluster_normales.push_back(cluster_normal); + list_cluster_area.push_back(cumulated_area); + Vector v_vertical(0.,0.,1.); + list_cluster_cosangle_vertical.push_back(std::fabs(v_vertical*cluster_normal)); + } } - } is_available.clear(); //discovery orthogonal relationship between clusters std::vector < std::vector < bool > > group_planes_orthogonal; - for( std::size_t i=0;i gp_tmp; for( std::size_t j=0;j gp_tmp; + for( std::size_t j=0;j cosangle_centroids; - std::vector < int > list_cluster_index; for( std::size_t i=0;i list_cluster_index; + for( std::size_t i=0;i1.-epsilon) cosangle_centroids[i]=1; - } - for (std::size_t i=0; i1.-epsilon) + cosangle_centroids[i]=1; + } + for (std::size_t i=0; i "; - for (std::size_t j=0; j "; + for (std::size_t j=0; j "; - for (std::size_t j=0;j "; + for (std::size_t j=0;j "< "< "< "< > subgraph_clusters; std::vector < int > subgraph_clusters_max_area_index; - std::vector < bool > is_free; for (std::size_t i=0; i is_free; + for (std::size_t i=0; i 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; - //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; - //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); } - - //update containers - index_container_former_ring.clear(); - for(std::list < int >::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); } - } is_free.clear(); //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 subgraph_clusters_prop_temp; + for (std::size_t j=0;j cluster_is_available; - for( std::size_t i=0;i 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; + //initialization containers + std::vector < int > 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; + //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); - } + //update containers + index_container_former_ring.clear(); + for(std::list < int >::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); + } //recompute optimal plane for each primitive after normal regularization - for (std::size_t i=0; i 1. - epsilon) extracted_planes[index_prim]=plane_reg; + if( std::fabs(extracted_planes[index_prim].orthogonal_vector()*plane_reg.orthogonal_vector()) > 1. - epsilon) + extracted_planes[index_prim]=plane_reg; + } } - } @@ -455,45 +537,54 @@ namespace CGAL { //detecting co-planarity and store in list_coplanar_prim std::vector< std::vector< std::vector < int > > > list_coplanar_prim; - for (std::size_t i=0; i > list_coplanar_prim_tmp; - Vector vec_reg=list_cluster_normales[i]; - std::vector < int > list_cop_index; for( std::size_t ip=0;ip > list_coplanar_prim_tmp; + Vector vec_reg=list_cluster_normales[i]; + std::vector < int > list_cop_index; + for( std::size_t ip=0;ip list_coplanar_prim_tmp_tmp; - list_cop_index[j]=cop_index; - list_coplanar_prim_tmp_tmp.push_back(index_prim); + std::vector < int > list_coplanar_prim_tmp_tmp; + list_cop_index[j]=cop_index; + list_coplanar_prim_tmp_tmp.push_back(index_prim); - Point pt_reg=extracted_planes[index_prim].projection(list_centroid[index_prim]); - Plane plan_reg(pt_reg,vec_reg); + Point pt_reg=extracted_planes[index_prim].projection(list_centroid[index_prim]); + Plane plan_reg(pt_reg,vec_reg); - for (std::size_t k=j+1; k > list_primitive_reg_index_extracted_planes; std::vector < Plane > list_primitive_reg; - for (std::size_t i=0;i list_primitive_reg_index_extracted_planes_tmp1; - for (std::size_t k=0; k 1. - epsilon){ - if(extracted_planes[index_prim].orthogonal_vector()*plane_reg.orthogonal_vector()<0) extracted_planes[index_prim]=plane_reg.opposite(); - else extracted_planes[index_prim]=plane_reg; - is_reg_used=true; - list_primitive_reg_index_extracted_planes_tmp1.push_back(index_prim); + bool is_reg_used=false; + std::vector< int > list_primitive_reg_index_extracted_planes_tmp1; + + for (std::size_t k=0; k 1. - epsilon) + { + if(extracted_planes[index_prim].orthogonal_vector()*plane_reg.orthogonal_vector()<0) + extracted_planes[index_prim]=plane_reg.opposite(); + else + extracted_planes[index_prim]=plane_reg; + is_reg_used=true; + list_primitive_reg_index_extracted_planes_tmp1.push_back(index_prim); + } + else{ + list_primitive_reg.push_back(extracted_planes[index_prim]); + std::vector< int > list_primitive_reg_index_extracted_planes_tmp; + list_primitive_reg_index_extracted_planes_tmp.push_back(index_prim); + list_primitive_reg_index_extracted_planes.push_back(list_primitive_reg_index_extracted_planes_tmp); + } + } + if(is_reg_used) { + list_primitive_reg.push_back(plane_reg); + list_primitive_reg_index_extracted_planes.push_back(list_primitive_reg_index_extracted_planes_tmp1); + } } - else{ - list_primitive_reg.push_back(extracted_planes[index_prim]); - std::vector< int > list_primitive_reg_index_extracted_planes_tmp; - list_primitive_reg_index_extracted_planes_tmp.push_back(index_prim); - list_primitive_reg_index_extracted_planes.push_back(list_primitive_reg_index_extracted_planes_tmp); - } - } - if(is_reg_used) { - list_primitive_reg.push_back(plane_reg); - list_primitive_reg_index_extracted_planes.push_back(list_primitive_reg_index_extracted_planes_tmp1); - } } - } std::cout<