added minimum_region_size parameter for polyline_graph construction

This commit is contained in:
Sven Oesau 2022-05-15 22:26:49 +02:00
parent aef4e58e5b
commit 552fed46c7
1 changed files with 22 additions and 2 deletions

View File

@ -125,20 +125,31 @@ namespace Polygon_mesh {
\pre `edges(pmesh).size() > 0` \pre `edges(pmesh).size() > 0`
*/ */
template<typename FaceToRegionMap, template<typename FaceToRegionMap,
typename OutputIterator,
typename NamedParameters = parameters::Default_named_parameters> typename NamedParameters = parameters::Default_named_parameters>
Polyline_graph( Polyline_graph(
const PolygonMesh& pmesh, const PolygonMesh& pmesh,
FaceToRegionMap face_to_region_map, FaceToRegionMap face_to_region_map,
std::size_t nb_regions,
OutputIterator trivial_edges_out,
const NamedParameters& np = parameters::default_values()) const NamedParameters& np = parameters::default_values())
: m_vpm(parameters::choose_parameter(parameters::get_parameter( : m_vpm(parameters::choose_parameter(parameters::get_parameter(
np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh))) np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)))
, m_segment_map(&pmesh, m_vpm) , m_segment_map(&pmesh, m_vpm), m_min_triangle_region_size(parameters::choose_parameter(
parameters::get_parameter(np, internal_np::minimum_region_size), 0))
{ {
clear(); clear();
typedef typename boost::property_map<PolygonMesh, CGAL::dynamic_edge_property_t<std::size_t> >::const_type EdgeIndexMap; typedef typename boost::property_map<PolygonMesh, CGAL::dynamic_edge_property_t<std::size_t> >::const_type EdgeIndexMap;
EdgeIndexMap eimap = get(CGAL::dynamic_edge_property_t<std::size_t>(), pmesh); EdgeIndexMap eimap = get(CGAL::dynamic_edge_property_t<std::size_t>(), pmesh);
std::vector<int> nb_faces_per_patch(nb_regions,0);
for(face_descriptor f : faces(pmesh))
{
std::size_t pid = get(face_to_region_map, f);
nb_faces_per_patch[pid]+=1;
}
// collect edges either on the boundary or having two different incident regions // collect edges either on the boundary or having two different incident regions
for (const auto& edge : edges(pmesh)) for (const auto& edge : edges(pmesh))
{ {
@ -158,7 +169,15 @@ namespace Polygon_mesh {
if (r1 == r2) if (r1 == r2)
put(eimap, edge, std::size_t(-1)); put(eimap, edge, std::size_t(-1));
else else
add_graph_edge(edge, r1, r2, eimap); {
if (r1!=std::size_t(-1) && r2!=std::size_t(-1) && (nb_faces_per_patch[r1] <= m_min_triangle_region_size || nb_faces_per_patch[r2] <= m_min_triangle_region_size))
{
*trivial_edges_out++=edge;
put(eimap, edge, std::size_t(-1));
}
else
add_graph_edge(edge, r1, r2, eimap);
}
} }
// build adjacency between edges // build adjacency between edges
@ -292,6 +311,7 @@ namespace Polygon_mesh {
const Segment_map m_segment_map; const Segment_map m_segment_map;
std::vector<PEdge> m_pedges; std::vector<PEdge> m_pedges;
std::size_t m_min_triangle_region_size;
template <class EdgeIndexMap> template <class EdgeIndexMap>
void add_graph_edge( void add_graph_edge(