fix surface_mesh_test.cpp

This commit is contained in:
Andreas Fabri 2014-11-25 18:28:50 +01:00
parent c4abaab0a3
commit d5f74fd542
3 changed files with 49 additions and 41 deletions

View File

@ -1840,6 +1840,9 @@ public:
bool is_border(Vertex_index v, bool check_all_incident_halfedges = true) const
{
Halfedge_index h(halfedge(v));
if (h == null_halfedge()){
return false;
}
if(check_all_incident_halfedges){
Halfedge_around_target_circulator hatc(h,*this), done(hatc);
do {
@ -1870,8 +1873,9 @@ public:
/// associated to vertex `v` to a border halfedge and returns `true` if it exists.
bool set_vertex_halfedge_to_border_halfedge(Vertex_index v)
{
if(halfedge(v) == null_halfedge())
if(halfedge(v) == null_halfedge()){
return false;
}
Halfedge_around_target_circulator hatc(halfedge(v),*this), done(hatc);
do {
if(is_border(*hatc)){
@ -2207,13 +2211,13 @@ operator=(const Surface_mesh<P>& rhs)
fprops_ = rhs.fprops_;
// property handles contain pointers, have to be reassigned
vconn_ = property_map<Vertex_index, Vertex_connectivity>("v:connectivity");
hconn_ = property_map<Halfedge_index, Halfedge_connectivity>("h:connectivity");
fconn_ = property_map<Face_index, Face_connectivity>("f:connectivity");
vremoved_ = property_map<Vertex_index, bool>("v:removed");
eremoved_ = property_map<Edge_index, bool>("e:removed");
fremoved_ = property_map<Face_index, bool>("f:removed");
vpoint_ = property_map<Vertex_index, P>("v:point");
vconn_ = property_map<Vertex_index, Vertex_connectivity>("v:connectivity").first;
hconn_ = property_map<Halfedge_index, Halfedge_connectivity>("h:connectivity").first;
fconn_ = property_map<Face_index, Face_connectivity>("f:connectivity").first;
vremoved_ = property_map<Vertex_index, bool>("v:removed").first;
eremoved_ = property_map<Edge_index, bool>("e:removed").first;
fremoved_ = property_map<Face_index, bool>("f:removed").first;
vpoint_ = property_map<Vertex_index, P>("v:point").first;
// how many elements are removed?
removed_vertices_ = rhs.removed_vertices_;
@ -2487,6 +2491,7 @@ Surface_mesh<P>::add_face(const Range& r)
for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)
if (is_new[i]){
halfedges[i] = add_edge(vertices[i], vertices[ii]);
set_face(opposite(halfedges[i]), null_face()); // as it may be recycled we have to reset it
assert(source(halfedges[i]) == vertices[i]);
}
// create the face
@ -2580,7 +2585,9 @@ Surface_mesh<P>::
degree(Vertex_index v) const
{
size_type count(0);
if(halfedge(v) == null_halfedge()){
return 0;
}
Vertex_around_target_circulator vvit(halfedge(v), *this);
Vertex_around_target_circulator vvend = vvit;
if(vvit) do
@ -2599,7 +2606,9 @@ Surface_mesh<P>::
degree(Face_index f) const
{
size_type count(0);
if(halfedge(f) == null_halfedge()){
return 0;
}
Vertex_around_face_circulator fvit(halfedge(f),*this);
Vertex_around_face_circulator fvend = fvit;
if(fvit) do {

View File

@ -37,8 +37,8 @@ struct Surface_fixture {
}
Sm m;
Sm::Vertex_descriptor u, v, w, x, y;
Sm::Face_descriptor f1, f2, f3;
Sm::Vertex_index u, v, w, x, y;
Sm::Face_index f1, f2, f3;
~Surface_fixture() {}
};
@ -71,8 +71,8 @@ struct Surface_fixture_2 {
}
Sm m;
Sm::Vertex_descriptor u, v, w, x, y;
Sm::Face_descriptor f1, f2, f3, f4;
Sm::Vertex_index u, v, w, x, y;
Sm::Face_index f1, f2, f3, f4;
~Surface_fixture_2() {}
};
@ -96,7 +96,7 @@ struct Surface_fixture_3 {
y = m.add_vertex(Point_3(2,0,0));
z = m.add_vertex(Point_3(2,1,0));
std::vector<Sm::Vertex_descriptor> vec;
std::vector<Sm::Vertex_index> vec;
using namespace boost::assign;
vec += u, v, w, x;
f1 = m.add_face(vec);
@ -106,8 +106,8 @@ struct Surface_fixture_3 {
}
Sm m;
Sm::Vertex_descriptor u, v, w, x, y, z;
Sm::Face_descriptor f1, f2;
Sm::Vertex_index u, v, w, x, y, z;
Sm::Face_index f1, f2;
~Surface_fixture_3() {}
};

View File

@ -35,6 +35,10 @@ BOOST_AUTO_TEST_CASE( standard_iterators )
boost::tie(vb, ve) = f.m.vertices();
test_iterator(vb, ve, 5);
Sm::Halfedge_iterator hb, he;
boost::tie(hb, he) = f.m.halfedges();
test_iterator(hb, he, 14);
Sm::Edge_iterator eb, ee;
boost::tie(eb, ee) = f.m.edges();
test_iterator(eb, ee, 7);
@ -92,9 +96,9 @@ BOOST_AUTO_TEST_CASE( test_remove_edge )
// now remove a border edge to check if this works
// this should not lower the number of faces
Sm::size_type old_removed_faces_size = f.m.num_removed_faces();
Sm::size_type old_removed_faces_size = f.m.number_of_removed_faces();
f.m.remove_edge(Sm::Edge_index(wx));
BOOST_CHECK_EQUAL(f.m.num_removed_faces(), old_removed_faces_size);
BOOST_CHECK_EQUAL(f.m.number_of_removed_faces(), old_removed_faces_size);
}
@ -123,50 +127,45 @@ BOOST_AUTO_TEST_CASE( memory_reuse_test )
}
// remove all faces
std::size_t old_face_size = f.m.num_faces() - f.m.num_removed_faces();
std::size_t old_face_size = f.m.number_of_faces();
std::size_t old_removed_face_size = f.m.number_of_removed_faces();
boost::range::for_each(f.m.faces(), boost::bind(&Sm::remove_face, boost::ref(f.m), _1));
BOOST_CHECK_EQUAL(f.m.num_faces() - f.m.num_removed_faces(), 0);
BOOST_CHECK_EQUAL(f.m.num_faces(), old_face_size);
BOOST_CHECK_EQUAL(f.m.number_of_faces(), 0);
BOOST_CHECK_EQUAL(f.m.number_of_removed_faces(), old_face_size + old_removed_face_size);
// remove all edges
std::size_t old_edge_size = f.m.num_edges() - f.m.num_removed_edges();
std::size_t old_edge_size = f.m.number_of_edges();
std::size_t old_removed_edge_size = f.m.number_of_removed_edges();
boost::range::for_each(f.m.edges(),
boost::bind(static_cast<void (Sm::*)(Sm::Edge_index)>(&Sm::remove_edge),
boost::ref(f.m), _1));
BOOST_CHECK_EQUAL(f.m.num_faces() - f.m.num_removed_faces(), 0);
BOOST_CHECK_EQUAL(f.m.num_edges(), old_edge_size);
BOOST_CHECK_EQUAL(f.m.number_of_faces() , 0);
BOOST_CHECK_EQUAL(f.m.number_of_removed_edges(), old_edge_size + old_removed_edge_size);
int fc = 0;
// add all again
for(Faces::iterator it = faces.begin(); it != faces.end(); ++it) {
std::cout << "add face " << fc++ << std::endl;
Sm::Face_index fd = f.m.add_face(*it);
BOOST_CHECK(fd.is_valid());
f.m.fix_border(f.m.halfedge(fd));
f.m.set_vertex_halfedge_to_border_halfedge(f.m.halfedge(fd));
for(VecFace::iterator it2 = it->begin(); it2 != it->end(); ++it2) {
std::cout << std::boolalpha << "Added: " << *it2 << " border?" << f.m.is_border(*it2) << std::endl;
Sm::Halfedge_index h = f.m.halfedge(*it2);
std::cout << h << h.is_valid() << std::endl;
Sm::Face_index fa = f.m.face(h);
std::cout << fa << fa.is_valid() << std::endl;
std::cout << h << " " << fa << std::endl;
std::cout << std::boolalpha << "deleted" << f.m.is_removed(fa) << f.m.is_removed(h) << std::endl;
}
std::cout << "success" << std::endl;
}
BOOST_CHECK_EQUAL(f.m.num_edges() - f.m.num_removed_edges(), old_edge_size);
BOOST_CHECK_EQUAL(f.m.num_edges() - f.m.num_removed_faces(), old_face_size);
BOOST_CHECK_EQUAL(f.m.number_of_edges() , old_edge_size);
BOOST_CHECK_EQUAL(f.m.number_of_faces() , old_face_size);
// remove all vertices
std::size_t old_size = f.m.num_vertices() - f.m.num_removed_vertices();
std::size_t old_size = f.m.number_of_vertices();
std::size_t old_removed_size = f.m.number_of_removed_vertices();
boost::range::for_each(f.m.vertices(), boost::bind(&Sm::remove_vertex, boost::ref(f.m), _1));
BOOST_CHECK_EQUAL(f.m.num_vertices() - f.m.num_removed_vertices(), 0);
BOOST_CHECK_EQUAL(f.m.num_vertices(), old_size);
BOOST_CHECK_EQUAL(f.m.number_of_vertices() , 0);
BOOST_CHECK_EQUAL(f.m.number_of_removed_vertices(), old_size + old_removed_size);
for(unsigned int i = 0; i < old_size; ++i)
{
@ -174,7 +173,7 @@ BOOST_AUTO_TEST_CASE( memory_reuse_test )
}
// the size must remain the same
BOOST_CHECK_EQUAL(f.m.num_vertices() - f.m.num_removed_vertices(), old_size);
BOOST_CHECK_EQUAL(f.m.number_of_vertices(), old_size);
}
BOOST_AUTO_TEST_CASE( test_validate )
@ -195,7 +194,7 @@ BOOST_AUTO_TEST_CASE(isolated_vertex_check)
Sm::Vertex_index isolated = f.m.add_vertex(Point_3(10, 10, 10));
BOOST_CHECK(f.m.is_isolated(isolated));
BOOST_CHECK(!f.m.halfedge(isolated).is_valid());
BOOST_CHECK(f.m.is_border(isolated));
BOOST_CHECK(! f.m.is_border(isolated));
BOOST_CHECK(f.m.degree(isolated) == 0);
}