fix PMP code

This commit is contained in:
Sébastien Loriot 2023-02-16 17:28:12 +01:00
parent 9362ff1ee8
commit 31f5ce1f6a
3 changed files with 122 additions and 12 deletions

View File

@ -4,5 +4,4 @@ PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Shape Detection"
EXTRACT_ALL = NO EXTRACT_ALL = NO
HIDE_UNDOC_CLASSES = YES HIDE_UNDOC_CLASSES = YES
WARN_IF_UNDOCUMENTED = NO WARN_IF_UNDOCUMENTED = NO
PREDEFINED = DOXYGEN_NS
EXCLUDE = ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polygon_mesh_processing EXCLUDE = ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polygon_mesh_processing

View File

@ -96,9 +96,6 @@ region_growing_of_planes_on_faces(const PolygonMesh& mesh,
using VPM = typename GetVertexPointMap < PolygonMesh, NamedParameters>::const_type; using VPM = typename GetVertexPointMap < PolygonMesh, NamedParameters>::const_type;
using Traits = typename GetGeomTraits<PolygonMesh, NamedParameters>::type; using Traits = typename GetGeomTraits<PolygonMesh, NamedParameters>::type;
using Graph_traits = boost::graph_traits<PolygonMesh>;
using face_descriptor = typename Graph_traits::face_descriptor;
using parameters::choose_parameter; using parameters::choose_parameter;
using parameters::get_parameter; using parameters::get_parameter;

View File

@ -32,6 +32,17 @@
namespace CGAL { namespace CGAL {
namespace Shape_detection { namespace Shape_detection {
template <typename RegionType, typename RegionMap,
bool b=std::is_same<RegionMap, typename RegionType::Region_index_map>::value>
struct pipo{
static RegionMap create_map(RegionType) { return RegionMap(); }
};
template <typename RegionType, typename RegionMap>
struct pipo<RegionType, RegionMap, true>{
static RegionMap create_map(RegionType& r ) { return r.region_index_map(); }
};
/*! /*!
\ingroup PkgShapeDetectionRG \ingroup PkgShapeDetectionRG
@ -79,7 +90,7 @@ namespace Shape_detection {
using Running_queue = std::queue<Item>; using Running_queue = std::queue<Item>;
public: public:
/// \name Initialization /// \name Initialization (RegionMap is the default type)
/// @{ /// @{
/*! /*!
@ -94,7 +105,7 @@ namespace Shape_detection {
either `CGAL::Dereference_property_map` or `CGAL::Identity_property_map`. either `CGAL::Dereference_property_map` or `CGAL::Identity_property_map`.
\param input_range \param input_range
a range of input items for region growing. `input_range` must not be empty. a range of input items for region growing.
\param neighbor_query \param neighbor_query
an instance of `NeighborQuery` that is used internally to an instance of `NeighborQuery` that is used internally to
@ -106,18 +117,22 @@ namespace Shape_detection {
\param item_map \param item_map
an instance of the property map to retrieve items from input values an instance of the property map to retrieve items from input values
\pre `input_range.size() > 0`
*/ */
template<typename InputRange, typename ItemMap = Default> template<typename InputRange, typename ItemMap = Default>
Region_growing( Region_growing(
const InputRange& input_range, const InputRange& input_range,
NeighborQuery& neighbor_query, NeighborQuery& neighbor_query,
RegionType& region_type, RegionType& region_type,
ItemMap item_map = ItemMap(), ItemMap item_map = ItemMap()
std::enable_if_t<std::is_same<RegionMap, typename Region_type::Region_index_map>::value>* = 0 #ifndef DOXYGEN_RUNNING
, std::enable_if<!std::is_same<ItemMap, RegionMap>::value>* = 0
#endif
) : ) :
m_neighbor_query(neighbor_query), m_neighbor_query(neighbor_query),
m_region_type(region_type), m_region_type(region_type),
m_region_map(region_type.region_index_map()), m_region_map(pipo<Region_type, RegionMap>::create_map(region_type)),
m_visited(m_visited_map) m_visited(m_visited_map)
{ {
CGAL_precondition(input_range.size() > 0); CGAL_precondition(input_range.size() > 0);
@ -134,8 +149,104 @@ namespace Shape_detection {
clear(input_range, item_map_); clear(input_range, item_map_);
} }
/// \copydoc Region_growing() /*!
/// \param rm external property map that will be filled when calling `detect()` \brief initializes the region growing algorithm.
\tparam InputRange
a model of `ConstRange`
\tparam SeedRange
a model of `ConstRange` with `Item` as value type
\tparam ItemMap
a model of `ReadablePropertyMap` with `InputRange::const_iterator` as key type and `Item` as value type.
A default can be deduced using the value type of `InputRange` and `Item` to be
either `CGAL::Dereference_property_map` or `CGAL::Identity_property_map`.
\param input_range
a range of input items for region growing
\param neighbor_query
an instance of `NeighborQuery` that is used internally to
access item's neighbors
\param region_type
an instance of `RegionType` that is used internally to
control if items form a valid region type
\param seed_range
a vector of `Item` that is used as seeds for the region growing.
Defaults to the full input_range.
\param item_map
an instance of the property map to retrieve items from input values
\pre `input_range.size() > 0`
*/
template<typename InputRange, typename SeedRange, typename ItemMap = Default>
Region_growing(
const InputRange& input_range,
SeedRange& seed_range,
NeighborQuery& neighbor_query,
RegionType& region_type,
ItemMap item_map = ItemMap()
#ifndef DOXYGEN_RUNNING
, std::enable_if<!std::is_same<ItemMap, RegionMap>::value>* = 0
#endif
) :
m_neighbor_query(neighbor_query),
m_region_type(region_type),
m_region_map(pipo<Region_type, RegionMap>::create_map(region_type)),
m_visited(m_visited_map) {
CGAL_precondition(input_range.size() > 0);
CGAL_precondition(seed_range.size() > 0);
m_seed_range.resize(seed_range.size());
using Item_helper = internal::Item_map_helper<ItemMap, Item, typename InputRange::const_iterator>;
using Item_map = typename Item_helper::type;
Item_map item_map_ = Item_helper::get(item_map);
std::size_t idx = 0;
for (auto it = seed_range.begin(); it != seed_range.end(); it++)
m_seed_range[idx++] = *it;
clear(input_range, item_map_);
}
/// @}
/// \name Initialization (RegionMap is a user provided type)
/// @{
/*!
\brief initializes the region growing algorithm.
\tparam InputRange
a model of `ConstRange`
\tparam ItemMap
a model of `ReadablePropertyMap` with `InputRange::const_iterator` as key type and `Item` as value type.
A default can be deduced using the value type of `InputRange` and `Item` to be
either `CGAL::Dereference_property_map` or `CGAL::Identity_property_map`.
\param input_range
a range of input items for region growing.
\param neighbor_query
an instance of `NeighborQuery` that is used internally to
access item's neighbors
\param region_type
an instance of `RegionType` that is used internally to
control if items form a valid region type
\param item_map
an instance of the property map to retrieve items from input values
\param rm external property map that will be filled when calling `detect()`
\pre `input_range.size() > 0`
*/
template<typename InputRange, typename ItemMap = Default> template<typename InputRange, typename ItemMap = Default>
Region_growing( Region_growing(
const InputRange& input_range, const InputRange& input_range,
@ -194,6 +305,8 @@ namespace Shape_detection {
\param item_map \param item_map
an instance of the property map to retrieve items from input values an instance of the property map to retrieve items from input values
\param rm external property map that will be filled when calling `detect()`
\pre `input_range.size() > 0` \pre `input_range.size() > 0`
*/ */
template<typename InputRange, typename SeedRange, typename ItemMap = Default> template<typename InputRange, typename SeedRange, typename ItemMap = Default>
@ -202,10 +315,11 @@ namespace Shape_detection {
SeedRange& seed_range, SeedRange& seed_range,
NeighborQuery& neighbor_query, NeighborQuery& neighbor_query,
RegionType& region_type, RegionType& region_type,
Region_map rm,
ItemMap item_map = ItemMap()) : ItemMap item_map = ItemMap()) :
m_neighbor_query(neighbor_query), m_neighbor_query(neighbor_query),
m_region_type(region_type), m_region_type(region_type),
m_region_map(region_type.region_index_map()), m_region_map(rm),
m_visited(m_visited_map) { m_visited(m_visited_map) {
CGAL_precondition(input_range.size() > 0); CGAL_precondition(input_range.size() > 0);