mirror of https://github.com/CGAL/cgal
simplify API
This commit is contained in:
parent
08f3d051e8
commit
432207df48
|
|
@ -20,7 +20,7 @@ using Plane_region = CGAL::Shape_detection::Polygon_mesh::Least_squares_plane_
|
||||||
using RG_planes = CGAL::Shape_detection::Region_growing<Face_range, One_ring_query, Plane_region>;
|
using RG_planes = CGAL::Shape_detection::Region_growing<Face_range, One_ring_query, Plane_region>;
|
||||||
|
|
||||||
using Face_to_region_map = typename Plane_region::Face_to_region_map;
|
using Face_to_region_map = typename Plane_region::Face_to_region_map;
|
||||||
using Polyline_graph = CGAL::Shape_detection::Polygon_mesh::Polyline_graph<Kernel, Surface_mesh, Face_to_region_map>;
|
using Polyline_graph = CGAL::Shape_detection::Polygon_mesh::Polyline_graph<Surface_mesh>;
|
||||||
using Segment_range = typename Polyline_graph::Segment_range;
|
using Segment_range = typename Polyline_graph::Segment_range;
|
||||||
using Segment_map = typename Polyline_graph::Segment_map;
|
using Segment_map = typename Polyline_graph::Segment_map;
|
||||||
|
|
||||||
|
|
@ -61,7 +61,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
// Find linear regions.
|
// Find linear regions.
|
||||||
const Face_to_region_map face_to_region_map(face_range, regions);
|
const Face_to_region_map face_to_region_map(face_range, regions);
|
||||||
Polyline_graph pgraph(surface_mesh, CGAL::parameters::face_index_map(face_to_region_map));
|
Polyline_graph pgraph(surface_mesh, face_to_region_map);
|
||||||
const auto& segment_range = pgraph.segment_range();
|
const auto& segment_range = pgraph.segment_range();
|
||||||
std::cout << "* number of extracted segments: " << segment_range.size() << std::endl;
|
std::cout << "* number of extracted segments: " << segment_range.size() << std::endl;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,16 +31,9 @@ namespace Polygon_mesh {
|
||||||
This class returns all edges, which form polylines splitting the polygon mesh
|
This class returns all edges, which form polylines splitting the polygon mesh
|
||||||
being a `PolygonMesh` into planar regions.
|
being a `PolygonMesh` into planar regions.
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `Kernel`
|
|
||||||
|
|
||||||
\tparam PolygonMesh
|
\tparam PolygonMesh
|
||||||
a model of `FaceListGraph`
|
a model of `FaceListGraph`
|
||||||
|
|
||||||
\tparam FaceToRegionMap
|
|
||||||
a model of `ReadablePropertyMap` whose key type is `face_descriptor` of the `PolygonMesh`
|
|
||||||
and value type is `std::size_t`
|
|
||||||
|
|
||||||
\tparam VertexToPointMap
|
\tparam VertexToPointMap
|
||||||
a model of `ReadablePropertyMap` whose key type is the vertex type of a polygon mesh and
|
a model of `ReadablePropertyMap` whose key type is the vertex type of a polygon mesh and
|
||||||
value type is `Kernel::Point_3`
|
value type is `Kernel::Point_3`
|
||||||
|
|
@ -48,14 +41,14 @@ namespace Polygon_mesh {
|
||||||
\cgalModels `NeighborQuery`
|
\cgalModels `NeighborQuery`
|
||||||
*/
|
*/
|
||||||
template<
|
template<
|
||||||
typename GeomTraits,
|
|
||||||
typename PolygonMesh,
|
typename PolygonMesh,
|
||||||
typename FaceToRegionMap = typename property_map_selector<PolygonMesh, CGAL::face_index_t>::const_type,
|
typename VertexToPointMap = typename property_map_selector<PolygonMesh, CGAL::vertex_point_t>::const_type
|
||||||
typename VertexToPointMap = typename property_map_selector<PolygonMesh, CGAL::vertex_point_t>::const_type>
|
>
|
||||||
class Polyline_graph {
|
class Polyline_graph {
|
||||||
|
|
||||||
using face_descriptor = typename boost::graph_traits<PolygonMesh>::face_descriptor;
|
using face_descriptor = typename boost::graph_traits<PolygonMesh>::face_descriptor;
|
||||||
using edge_descriptor = typename boost::graph_traits<PolygonMesh>::edge_descriptor;
|
using edge_descriptor = typename boost::graph_traits<PolygonMesh>::edge_descriptor;
|
||||||
|
using halfedge_descriptor = typename boost::graph_traits<PolygonMesh>::halfedge_descriptor;
|
||||||
|
|
||||||
struct PEdge {
|
struct PEdge {
|
||||||
std::size_t index = std::size_t(-1);
|
std::size_t index = std::size_t(-1);
|
||||||
|
|
@ -67,10 +60,6 @@ namespace Polygon_mesh {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// \cond SKIP_IN_MANUAL
|
/// \cond SKIP_IN_MANUAL
|
||||||
using Traits = GeomTraits;
|
|
||||||
using Face_graph = PolygonMesh;
|
|
||||||
using Face_to_region_map = FaceToRegionMap;
|
|
||||||
|
|
||||||
using Vertex_to_point_map = VertexToPointMap;
|
using Vertex_to_point_map = VertexToPointMap;
|
||||||
/// \endcond
|
/// \endcond
|
||||||
|
|
||||||
|
|
@ -109,7 +98,7 @@ namespace Polygon_mesh {
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
/// \cond SKIP_IN_MANUAL
|
||||||
using Segment_range = Iterator_range<Transform_iterator>;
|
using Segment_range = Iterator_range<Transform_iterator>;
|
||||||
using Segment_map = Segment_from_edge_descriptor_map<Face_graph, Vertex_to_point_map>;
|
using Segment_map = Segment_from_edge_descriptor_map<PolygonMesh, Vertex_to_point_map>;
|
||||||
/// \endcond
|
/// \endcond
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -118,23 +107,22 @@ namespace Polygon_mesh {
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief initializes all internal data structures.
|
\brief initializes all internal data structures.
|
||||||
|
\tparam FaceToRegionMap
|
||||||
|
a model of `ReadablePropertyMap` whose key type is `face_descriptor` of the `PolygonMesh`
|
||||||
|
and value type is `std::size_t`
|
||||||
|
|
||||||
\tparam NamedParameters
|
\tparam NamedParameters
|
||||||
a sequence of \ref bgl_namedparameters "Named Parameters"
|
a sequence of optional \ref bgl_namedparameters "Named Parameters"
|
||||||
|
|
||||||
\param pmesh
|
\param pmesh a polygon mesh
|
||||||
an instance of a `PolygonMesh` that represents a polygon mesh
|
|
||||||
|
|
||||||
\param np
|
\param face_to_region_map maps each face of `pmesh` to
|
||||||
a sequence of \ref bgl_namedparameters "Named Parameters"
|
the corresponding planar regions id
|
||||||
among the ones listed below
|
|
||||||
|
\param np a sequence of \ref bgl_namedparameters "Named Parameters"
|
||||||
|
among the ones listed below
|
||||||
|
|
||||||
\cgalNamedParamsBegin
|
\cgalNamedParamsBegin
|
||||||
\cgalParamNBegin{face_index_map} // TODO THIS IS NOT OPTIONAL ---> parameter
|
|
||||||
\cgalParamDescription{an instance of `FaceToRegionMap` that maps faces of polygon mesh to
|
|
||||||
the corresponding planar regions they belong to}
|
|
||||||
\cgalParamDefault{`boost::get(CGAL::face_index, pmesh)`}
|
|
||||||
\cgalParamNEnd
|
|
||||||
\cgalParamNBegin{vertex_point_map}
|
\cgalParamNBegin{vertex_point_map}
|
||||||
\cgalParamDescription{an instance of `VertexToPointMap` that maps a polygon mesh
|
\cgalParamDescription{an instance of `VertexToPointMap` that maps a polygon mesh
|
||||||
vertex to `Kernel::Point_3`}
|
vertex to `Kernel::Point_3`}
|
||||||
|
|
@ -145,46 +133,54 @@ namespace Polygon_mesh {
|
||||||
\pre `faces(pmesh).size() > 0`
|
\pre `faces(pmesh).size() > 0`
|
||||||
\pre `edges(pmesh).size() > 0`
|
\pre `edges(pmesh).size() > 0`
|
||||||
*/
|
*/
|
||||||
template<typename NamedParameters = parameters::Default_named_parameters>
|
template<typename FaceToRegionMap,
|
||||||
|
typename NamedParameters = parameters::Default_named_parameters>
|
||||||
Polyline_graph(
|
Polyline_graph(
|
||||||
const PolygonMesh& pmesh,
|
const PolygonMesh& pmesh,
|
||||||
|
FaceToRegionMap face_to_region_map,
|
||||||
const NamedParameters& np = parameters::default_values())
|
const NamedParameters& np = parameters::default_values())
|
||||||
: m_face_graph(pmesh)
|
: m_vertex_to_point_map(parameters::choose_parameter(parameters::get_parameter(
|
||||||
, m_face_to_region_map(parameters::choose_parameter(parameters::get_parameter(
|
|
||||||
np, internal_np::face_index), get_const_property_map(CGAL::face_index, pmesh)))
|
|
||||||
, m_vertex_to_point_map(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_face_to_index_map(faces(m_face_graph))
|
, m_edge_to_index_map(edges(pmesh))
|
||||||
, m_edge_to_index_map(edges(m_face_graph))
|
, m_segment_map(&pmesh, m_vertex_to_point_map)
|
||||||
, m_segment_map(&m_face_graph, m_vertex_to_point_map)
|
|
||||||
{
|
{
|
||||||
build_graph();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
void build_graph() {
|
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
long r1 = -1, r2 = -1;
|
|
||||||
std::vector<std::size_t> pedge_map(
|
std::vector<std::size_t> pedge_map(
|
||||||
edges(m_face_graph).size(), std::size_t(-1));
|
edges(pmesh).size(), std::size_t(-1));
|
||||||
for (const auto& edge : edges(m_face_graph)) {
|
|
||||||
std::tie(r1, r2) = get_regions(edge);
|
// collect edges either on the boundary or having two different incident regions
|
||||||
|
for (const auto& edge : edges(pmesh))
|
||||||
|
{
|
||||||
|
halfedge_descriptor h1 = halfedge(edge, pmesh),
|
||||||
|
h2 = opposite(h1, pmesh);
|
||||||
|
|
||||||
|
face_descriptor f1 = face(h1, pmesh),
|
||||||
|
f2 = face(h2, pmesh);
|
||||||
|
|
||||||
|
std::size_t r1 = -1, r2 = -1;
|
||||||
|
|
||||||
|
if (f1 != boost::graph_traits<PolygonMesh>::null_face())
|
||||||
|
r1 = get(face_to_region_map, f1);
|
||||||
|
if (f2 != boost::graph_traits<PolygonMesh>::null_face())
|
||||||
|
r2 = get(face_to_region_map, f2);
|
||||||
|
|
||||||
if (r1 == r2) continue;
|
if (r1 == r2) continue;
|
||||||
add_graph_edge(edge, r1, r2, pedge_map);
|
add_graph_edge(edge, r1, r2, pedge_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// build adjacency between edges
|
||||||
for (std::size_t i = 0; i < m_pedges.size(); ++i) {
|
for (std::size_t i = 0; i < m_pedges.size(); ++i) {
|
||||||
auto& pedge = m_pedges[i];
|
auto& pedge = m_pedges[i];
|
||||||
CGAL_precondition(pedge.regions.first != pedge.regions.second);
|
CGAL_precondition(pedge.regions.first != pedge.regions.second);
|
||||||
CGAL_precondition(pedge.index != std::size_t(-1));
|
CGAL_precondition(pedge.index != std::size_t(-1));
|
||||||
|
|
||||||
const auto& edge = pedge.ed;
|
const auto& edge = pedge.ed;
|
||||||
const auto s = source(edge, m_face_graph);
|
const auto s = source(edge, pmesh);
|
||||||
const auto t = target(edge, m_face_graph);
|
const auto t = target(edge, pmesh);
|
||||||
|
|
||||||
add_vertex_neighbors(s, i, pedge_map, pedge.sneighbors);
|
add_vertex_neighbors(s, i, pedge_map, pedge.sneighbors, pmesh);
|
||||||
add_vertex_neighbors(t, i, pedge_map, pedge.tneighbors);
|
add_vertex_neighbors(t, i, pedge_map, pedge.tneighbors, pmesh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// \endcond
|
/// \endcond
|
||||||
|
|
@ -305,37 +301,12 @@ namespace Polygon_mesh {
|
||||||
/// \endcond
|
/// \endcond
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Face_graph& m_face_graph;
|
|
||||||
|
|
||||||
const Face_to_region_map m_face_to_region_map;
|
|
||||||
const Vertex_to_point_map m_vertex_to_point_map;
|
const Vertex_to_point_map m_vertex_to_point_map;
|
||||||
const Face_to_index_map m_face_to_index_map;
|
|
||||||
const Edge_to_index_map m_edge_to_index_map;
|
const Edge_to_index_map m_edge_to_index_map;
|
||||||
|
|
||||||
const Segment_map m_segment_map;
|
const Segment_map m_segment_map;
|
||||||
std::vector<PEdge> m_pedges;
|
std::vector<PEdge> m_pedges;
|
||||||
|
|
||||||
// what about boundary edges??
|
|
||||||
std::pair<long, long> get_regions(edge_descriptor edge) const {
|
|
||||||
|
|
||||||
const auto hedge1 = halfedge(edge, m_face_graph);
|
|
||||||
const auto hedge2 = opposite(hedge1, m_face_graph);
|
|
||||||
|
|
||||||
const auto face1 = face(hedge1, m_face_graph);
|
|
||||||
const auto face2 = face(hedge2, m_face_graph);
|
|
||||||
|
|
||||||
const std::size_t fi1 = get(m_face_to_index_map, face1);
|
|
||||||
const std::size_t fi2 = get(m_face_to_index_map, face2);
|
|
||||||
CGAL_precondition(fi1 != fi2);
|
|
||||||
|
|
||||||
long r1 = -1, r2 = -1;
|
|
||||||
if (fi1 != std::size_t(-1))
|
|
||||||
r1 = get(m_face_to_region_map, face1);
|
|
||||||
if (fi2 != std::size_t(-1))
|
|
||||||
r2 = get(m_face_to_region_map, face2);
|
|
||||||
return std::make_pair(r1, r2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void add_graph_edge(
|
void add_graph_edge(
|
||||||
edge_descriptor edge, const long region1, const long region2,
|
edge_descriptor edge, const long region1, const long region2,
|
||||||
std::vector<std::size_t>& pedge_map) {
|
std::vector<std::size_t>& pedge_map) {
|
||||||
|
|
@ -358,13 +329,14 @@ namespace Polygon_mesh {
|
||||||
void add_vertex_neighbors(
|
void add_vertex_neighbors(
|
||||||
const VertexType& vertex, const std::size_t curr_pe,
|
const VertexType& vertex, const std::size_t curr_pe,
|
||||||
const std::vector<std::size_t>& pedge_map,
|
const std::vector<std::size_t>& pedge_map,
|
||||||
std::set<std::size_t>& neighbors) const {
|
std::set<std::size_t>& neighbors,
|
||||||
|
const PolygonMesh& pmesh) const {
|
||||||
|
|
||||||
const auto query_hedge = halfedge(vertex, m_face_graph);
|
const auto query_hedge = halfedge(vertex, pmesh);
|
||||||
const auto hedges = halfedges_around_target(query_hedge, m_face_graph);
|
const auto hedges = halfedges_around_target(query_hedge, pmesh);
|
||||||
CGAL_precondition(hedges.size() > 0);
|
CGAL_precondition(hedges.size() > 0);
|
||||||
for (const auto& hedge : hedges) {
|
for (const auto& hedge : hedges) {
|
||||||
const auto e = edge(hedge, m_face_graph);
|
const auto e = edge(hedge, pmesh);
|
||||||
const std::size_t ei = get(m_edge_to_index_map, e);
|
const std::size_t ei = get(m_edge_to_index_map, e);
|
||||||
CGAL_precondition(ei < pedge_map.size());
|
CGAL_precondition(ei < pedge_map.size());
|
||||||
const std::size_t pe = pedge_map[ei];
|
const std::size_t pe = pedge_map[ei];
|
||||||
|
|
|
||||||
|
|
@ -180,7 +180,7 @@ bool test_lines_segment_set_3() {
|
||||||
using Face_to_region_map = typename Plane_region::Face_to_region_map;
|
using Face_to_region_map = typename Plane_region::Face_to_region_map;
|
||||||
|
|
||||||
using Polyline_graph = CGAL::Shape_detection::
|
using Polyline_graph = CGAL::Shape_detection::
|
||||||
Polygon_mesh::Polyline_graph<Kernel, Surface_mesh, Face_to_region_map>;
|
Polygon_mesh::Polyline_graph<Surface_mesh>;
|
||||||
using Segment_range = typename Polyline_graph::Segment_range;
|
using Segment_range = typename Polyline_graph::Segment_range;
|
||||||
using Segment_map = typename Polyline_graph::Segment_map;
|
using Segment_map = typename Polyline_graph::Segment_map;
|
||||||
|
|
||||||
|
|
@ -209,7 +209,7 @@ bool test_lines_segment_set_3() {
|
||||||
assert(face_range.size() == 7320);
|
assert(face_range.size() == 7320);
|
||||||
|
|
||||||
const Face_to_region_map face_to_region_map(face_range, regions);
|
const Face_to_region_map face_to_region_map(face_range, regions);
|
||||||
Polyline_graph pgraph(surface_mesh, CGAL::parameters::face_index_map(face_to_region_map));
|
Polyline_graph pgraph(surface_mesh, face_to_region_map);
|
||||||
const auto& segment_range = pgraph.segment_range();
|
const auto& segment_range = pgraph.segment_range();
|
||||||
|
|
||||||
Region_type region_type(
|
Region_type region_type(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue