mirror of https://github.com/CGAL/cgal
vertex anchor map int -> std::size_t
anchor map value type int to std::size_t general invalid tag
This commit is contained in:
parent
521d9566bc
commit
1a94e743ad
|
|
@ -32,6 +32,8 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define CGAL_VSA_INVALID_TAG std::numeric_limits<std::size_t>::max()
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
namespace VSA {
|
namespace VSA {
|
||||||
|
|
||||||
|
|
@ -100,7 +102,7 @@ private:
|
||||||
typedef typename boost::graph_traits<TriangleMesh>::face_descriptor face_descriptor;
|
typedef typename boost::graph_traits<TriangleMesh>::face_descriptor face_descriptor;
|
||||||
|
|
||||||
// internal typedefs
|
// internal typedefs
|
||||||
typedef boost::associative_property_map<boost::unordered_map<vertex_descriptor, int> > Vertex_anchor_map;
|
typedef boost::associative_property_map<boost::unordered_map<vertex_descriptor, std::size_t> > Vertex_anchor_map;
|
||||||
|
|
||||||
typedef std::vector<halfedge_descriptor> Chord_vector;
|
typedef std::vector<halfedge_descriptor> Chord_vector;
|
||||||
typedef typename Chord_vector::iterator Chord_vector_iterator;
|
typedef typename Chord_vector::iterator Chord_vector_iterator;
|
||||||
|
|
@ -231,7 +233,7 @@ private:
|
||||||
boost::unordered_map<face_descriptor, std::size_t> internal_fidx_map;
|
boost::unordered_map<face_descriptor, std::size_t> internal_fidx_map;
|
||||||
boost::associative_property_map<boost::unordered_map<face_descriptor, std::size_t> > fproxy_map;
|
boost::associative_property_map<boost::unordered_map<face_descriptor, std::size_t> > fproxy_map;
|
||||||
// The attached anchor index of a vertex.
|
// The attached anchor index of a vertex.
|
||||||
boost::unordered_map<vertex_descriptor, int> internal_vidx_map;
|
boost::unordered_map<vertex_descriptor, std::size_t> internal_vidx_map;
|
||||||
Vertex_anchor_map vanchor_map;
|
Vertex_anchor_map vanchor_map;
|
||||||
|
|
||||||
// Proxies.
|
// Proxies.
|
||||||
|
|
@ -325,11 +327,12 @@ public:
|
||||||
// rebuild internal data structure
|
// rebuild internal data structure
|
||||||
internal_fidx_map.clear();
|
internal_fidx_map.clear();
|
||||||
BOOST_FOREACH(face_descriptor f, faces(*m_pmesh))
|
BOOST_FOREACH(face_descriptor f, faces(*m_pmesh))
|
||||||
internal_fidx_map[f] = 0;
|
internal_fidx_map[f] = CGAL_VSA_INVALID_TAG;
|
||||||
|
|
||||||
internal_vidx_map.clear();
|
internal_vidx_map.clear();
|
||||||
BOOST_FOREACH(vertex_descriptor v, vertices(*m_pmesh))
|
BOOST_FOREACH(vertex_descriptor v, vertices(*m_pmesh))
|
||||||
internal_vidx_map.insert(std::pair<vertex_descriptor, int>(v, 0));
|
internal_vidx_map.insert(
|
||||||
|
std::pair<vertex_descriptor, std::size_t>(v, CGAL_VSA_INVALID_TAG));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
@ -479,9 +482,8 @@ public:
|
||||||
* Propagates the proxy seed facets and floods the whole mesh to minimize the fitting error.
|
* Propagates the proxy seed facets and floods the whole mesh to minimize the fitting error.
|
||||||
*/
|
*/
|
||||||
void partition() {
|
void partition() {
|
||||||
#define CGAL_NOT_TAGGED_ID std::numeric_limits<std::size_t>::max()
|
|
||||||
BOOST_FOREACH(face_descriptor f, faces(*m_pmesh))
|
BOOST_FOREACH(face_descriptor f, faces(*m_pmesh))
|
||||||
fproxy_map[f] = CGAL_NOT_TAGGED_ID;
|
fproxy_map[f] = CGAL_VSA_INVALID_TAG;
|
||||||
|
|
||||||
std::priority_queue<Facet_to_integrate> facet_pqueue;
|
std::priority_queue<Facet_to_integrate> facet_pqueue;
|
||||||
for (std::size_t i = 0; i < proxies.size(); ++i) {
|
for (std::size_t i = 0; i < proxies.size(); ++i) {
|
||||||
|
|
@ -490,7 +492,7 @@ public:
|
||||||
|
|
||||||
BOOST_FOREACH(face_descriptor fadj, faces_around_face(halfedge(f, *m_pmesh), *m_pmesh)) {
|
BOOST_FOREACH(face_descriptor fadj, faces_around_face(halfedge(f, *m_pmesh), *m_pmesh)) {
|
||||||
if (fadj != boost::graph_traits<TriangleMesh>::null_face()
|
if (fadj != boost::graph_traits<TriangleMesh>::null_face()
|
||||||
&& fproxy_map[fadj] == CGAL_NOT_TAGGED_ID) {
|
&& fproxy_map[fadj] == CGAL_VSA_INVALID_TAG) {
|
||||||
facet_pqueue.push(Facet_to_integrate(
|
facet_pqueue.push(Facet_to_integrate(
|
||||||
fadj, i, (*fit_error)(fadj, proxies[i].px)));
|
fadj, i, (*fit_error)(fadj, proxies[i].px)));
|
||||||
}
|
}
|
||||||
|
|
@ -500,18 +502,17 @@ public:
|
||||||
while (!facet_pqueue.empty()) {
|
while (!facet_pqueue.empty()) {
|
||||||
const Facet_to_integrate c = facet_pqueue.top();
|
const Facet_to_integrate c = facet_pqueue.top();
|
||||||
facet_pqueue.pop();
|
facet_pqueue.pop();
|
||||||
if (fproxy_map[c.f] == CGAL_NOT_TAGGED_ID) {
|
if (fproxy_map[c.f] == CGAL_VSA_INVALID_TAG) {
|
||||||
fproxy_map[c.f] = c.px;
|
fproxy_map[c.f] = c.px;
|
||||||
BOOST_FOREACH(face_descriptor fadj, faces_around_face(halfedge(c.f, *m_pmesh), *m_pmesh)) {
|
BOOST_FOREACH(face_descriptor fadj, faces_around_face(halfedge(c.f, *m_pmesh), *m_pmesh)) {
|
||||||
if (fadj != boost::graph_traits<TriangleMesh>::null_face()
|
if (fadj != boost::graph_traits<TriangleMesh>::null_face()
|
||||||
&& fproxy_map[fadj] == CGAL_NOT_TAGGED_ID) {
|
&& fproxy_map[fadj] == CGAL_VSA_INVALID_TAG) {
|
||||||
facet_pqueue.push(Facet_to_integrate(
|
facet_pqueue.push(Facet_to_integrate(
|
||||||
fadj, c.px, (*fit_error)(fadj, proxies[c.px].px)));
|
fadj, c.px, (*fit_error)(fadj, proxies[c.px].px)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#undef CGAL_NOT_TAGGED_ID
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
@ -859,9 +860,8 @@ public:
|
||||||
template <typename PolyhedronSurface>
|
template <typename PolyhedronSurface>
|
||||||
bool extract_mesh(PolyhedronSurface &tm_out, const FT chord_error = FT(0.2), bool pca_plane = false) {
|
bool extract_mesh(PolyhedronSurface &tm_out, const FT chord_error = FT(0.2), bool pca_plane = false) {
|
||||||
// initialize all vertex anchor status
|
// initialize all vertex anchor status
|
||||||
enum Vertex_status { NO_ANCHOR = -1 };
|
|
||||||
BOOST_FOREACH(vertex_descriptor v, vertices(*m_pmesh))
|
BOOST_FOREACH(vertex_descriptor v, vertices(*m_pmesh))
|
||||||
internal_vidx_map[v] = static_cast<int>(NO_ANCHOR);
|
internal_vidx_map[v] = CGAL_VSA_INVALID_TAG;
|
||||||
anchors.clear();
|
anchors.clear();
|
||||||
borders.clear();
|
borders.clear();
|
||||||
tris.clear();
|
tris.clear();
|
||||||
|
|
@ -872,7 +872,7 @@ public:
|
||||||
find_anchors();
|
find_anchors();
|
||||||
find_edges(chord_error);
|
find_edges(chord_error);
|
||||||
add_anchors();
|
add_anchors();
|
||||||
pseudo_CDT();
|
pseudo_cdt();
|
||||||
|
|
||||||
return build_polyhedron_surface(tm_out);
|
return build_polyhedron_surface(tm_out);
|
||||||
}
|
}
|
||||||
|
|
@ -1433,14 +1433,17 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief Runs the pseudo Constrained Delaunay Triangulation at each region, and stores the extracted indexed triangles in @a tris.
|
* @brief Runs the pseudo Constrained Delaunay Triangulation at each proxy region,
|
||||||
|
* and stores the extracted indexed triangles in @a tris.
|
||||||
|
* @pre all anchors are found, i.e. all boundary cycles have been visited
|
||||||
|
* and attached with at least 3 anchors.
|
||||||
*/
|
*/
|
||||||
void pseudo_CDT() {
|
void pseudo_cdt() {
|
||||||
// subgraph attached with vertex anchor status and edge weight
|
// subgraph attached with vertex anchor status and edge weight
|
||||||
typedef boost::property<boost::vertex_index1_t, int,
|
typedef boost::property<boost::vertex_index1_t, std::size_t,
|
||||||
boost::property<boost::vertex_index2_t, int> > VertexProperty;
|
boost::property<boost::vertex_index2_t, std::size_t> > VertexProperty;
|
||||||
typedef boost::property<boost::edge_weight_t, FT,
|
typedef boost::property<boost::edge_weight_t, FT,
|
||||||
boost::property<boost::edge_index_t, int> > EdgeProperty;
|
boost::property<boost::edge_index_t, std::size_t> > EdgeProperty;
|
||||||
typedef boost::subgraph<boost::adjacency_list<
|
typedef boost::subgraph<boost::adjacency_list<
|
||||||
boost::listS, boost::vecS,
|
boost::listS, boost::vecS,
|
||||||
boost::undirectedS,
|
boost::undirectedS,
|
||||||
|
|
@ -1486,10 +1489,10 @@ private:
|
||||||
vertex_patches[p].push_back(to_sgv_map[v]);
|
vertex_patches[p].push_back(to_sgv_map[v]);
|
||||||
}
|
}
|
||||||
BOOST_FOREACH(VertexVector &vpatch, vertex_patches) {
|
BOOST_FOREACH(VertexVector &vpatch, vertex_patches) {
|
||||||
// add a super vertex connecting to its boundary anchors into the main graph
|
// add a super vertex connecting to its boundary anchors in each patch
|
||||||
const sg_vertex_descriptor superv = add_vertex(gmain);
|
const sg_vertex_descriptor superv = add_vertex(gmain);
|
||||||
global_vanchor_map[superv] = 0;
|
global_vanchor_map[superv] = CGAL_VSA_INVALID_TAG;
|
||||||
global_vtag_map[superv] = 0;
|
global_vtag_map[superv] = CGAL_VSA_INVALID_TAG;
|
||||||
BOOST_FOREACH(sg_vertex_descriptor v, vpatch) {
|
BOOST_FOREACH(sg_vertex_descriptor v, vpatch) {
|
||||||
if (is_anchor_attached(v, global_vanchor_map))
|
if (is_anchor_attached(v, global_vanchor_map))
|
||||||
add_edge(superv, v, FT(0.0), gmain);
|
add_edge(superv, v, FT(0.0), gmain);
|
||||||
|
|
@ -1516,6 +1519,9 @@ private:
|
||||||
|
|
||||||
// backtrack to the anchor and tag each vertex in the local patch graph
|
// backtrack to the anchor and tag each vertex in the local patch graph
|
||||||
BOOST_FOREACH(sg_vertex_descriptor v, vertices(glocal)) {
|
BOOST_FOREACH(sg_vertex_descriptor v, vertices(glocal)) {
|
||||||
|
// skip the added super source vertex in the patch
|
||||||
|
if (v == source)
|
||||||
|
continue;
|
||||||
sg_vertex_descriptor curr = v;
|
sg_vertex_descriptor curr = v;
|
||||||
while (!is_anchor_attached(curr, local_vanchor_map))
|
while (!is_anchor_attached(curr, local_vanchor_map))
|
||||||
curr = pred[curr];
|
curr = pred[curr];
|
||||||
|
|
@ -1542,8 +1548,8 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
FT half_chord_len = vdist.back() / FT(2.0);
|
FT half_chord_len = vdist.back() / FT(2.0);
|
||||||
const int anchorleft = vanchor_map[source(chord.front(), *m_pmesh)];
|
const std::size_t anchorleft = vanchor_map[source(chord.front(), *m_pmesh)];
|
||||||
const int anchorright = vanchor_map[target(chord.back(), *m_pmesh)];
|
const std::size_t anchorright = vanchor_map[target(chord.back(), *m_pmesh)];
|
||||||
typename std::vector<FT>::iterator ditr = vdist.begin() + 1;
|
typename std::vector<FT>::iterator ditr = vdist.begin() + 1;
|
||||||
for (typename Chord_vector::iterator hitr = chord.begin();
|
for (typename Chord_vector::iterator hitr = chord.begin();
|
||||||
hitr != chord.end() - 1; ++hitr, ++ditr) {
|
hitr != chord.end() - 1; ++hitr, ++ditr) {
|
||||||
|
|
@ -1558,14 +1564,14 @@ private:
|
||||||
// collect triangles
|
// collect triangles
|
||||||
BOOST_FOREACH(face_descriptor f, faces(*m_pmesh)) {
|
BOOST_FOREACH(face_descriptor f, faces(*m_pmesh)) {
|
||||||
halfedge_descriptor he = halfedge(f, *m_pmesh);
|
halfedge_descriptor he = halfedge(f, *m_pmesh);
|
||||||
int i = global_vtag_map[to_sgv_map[source(he, *m_pmesh)]];
|
std::size_t i = global_vtag_map[to_sgv_map[source(he, *m_pmesh)]];
|
||||||
int j = global_vtag_map[to_sgv_map[target(he, *m_pmesh)]];
|
std::size_t j = global_vtag_map[to_sgv_map[target(he, *m_pmesh)]];
|
||||||
int k = global_vtag_map[to_sgv_map[target(next(he, *m_pmesh), *m_pmesh)]];
|
std::size_t k = global_vtag_map[to_sgv_map[target(next(he, *m_pmesh), *m_pmesh)]];
|
||||||
if (i != j && i != k && j != k) {
|
if (i != j && i != k && j != k) {
|
||||||
std::vector<std::size_t> t;
|
std::vector<std::size_t> t;
|
||||||
t.push_back(static_cast<std::size_t>(i));
|
t.push_back(i);
|
||||||
t.push_back(static_cast<std::size_t>(j));
|
t.push_back(j);
|
||||||
t.push_back(static_cast<std::size_t>(k));
|
t.push_back(k);
|
||||||
tris.push_back(t);
|
tris.push_back(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1715,7 +1721,7 @@ private:
|
||||||
bool is_anchor_attached(
|
bool is_anchor_attached(
|
||||||
const typename boost::property_traits<VertexAnchorIndexMap>::key_type &v,
|
const typename boost::property_traits<VertexAnchorIndexMap>::key_type &v,
|
||||||
const VertexAnchorIndexMap &vertex_anchor_map) const {
|
const VertexAnchorIndexMap &vertex_anchor_map) const {
|
||||||
return vertex_anchor_map[v] >= 0;
|
return vertex_anchor_map[v] != CGAL_VSA_INVALID_TAG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
@ -1723,7 +1729,7 @@ private:
|
||||||
* @param vtx vertex
|
* @param vtx vertex
|
||||||
*/
|
*/
|
||||||
void attach_anchor(const vertex_descriptor &vtx) {
|
void attach_anchor(const vertex_descriptor &vtx) {
|
||||||
vanchor_map[vtx] = static_cast<int>(anchors.size());
|
vanchor_map[vtx] = anchors.size();
|
||||||
anchors.push_back(Anchor(vtx, compute_anchor_position(vtx)));
|
anchors.push_back(Anchor(vtx, compute_anchor_position(vtx)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1855,4 +1861,6 @@ private:
|
||||||
} // end namespace VSA
|
} // end namespace VSA
|
||||||
} // end namespace CGAL
|
} // end namespace CGAL
|
||||||
|
|
||||||
|
#undef CGAL_VSA_INVALID_TAG
|
||||||
|
|
||||||
#endif // CGAL_SURFACE_MESH_APPROXIMATION_VSA_APPROXIMATION_H
|
#endif // CGAL_SURFACE_MESH_APPROXIMATION_VSA_APPROXIMATION_H
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue