the placement must store the triangles has the AABB-tree does not copy them

This commit is contained in:
Sébastien Loriot 2020-04-27 16:06:43 +02:00
parent 531071907b
commit d6d8fbeb8b
2 changed files with 12 additions and 9 deletions

View File

@ -59,21 +59,22 @@ private:
const Triangle_mesh& tm = profile.surface_mesh();
const Geom_traits& gt = profile.geom_traits();
std::vector<Triangle> input_triangles;
m_input_triangles.reserve(faces(tm).size());
for(face_descriptor f : faces(profile.surface_mesh()))
{
halfedge_descriptor h = halfedge(f, tm);
CGAL_assertion(!is_border(h, tm));
input_triangles.push_back(gt.construct_triangle_3_object()(
get(profile.vertex_point_map(), source(h, tm)),
get(profile.vertex_point_map(), target(h, tm)),
get(profile.vertex_point_map(), target(next(h, tm), tm))));
m_input_triangles.emplace_back(gt.construct_triangle_3_object()(
get(profile.vertex_point_map(), source(h, tm)),
get(profile.vertex_point_map(), target(h, tm)),
get(profile.vertex_point_map(), target(next(h, tm), tm))));
}
m_tree_ptr = new AABB_tree(input_triangles.begin(), input_triangles.end());
m_tree_ptr = new AABB_tree(m_input_triangles.begin(), m_input_triangles.end());
const_cast<AABB_tree*>(m_tree_ptr)->build();
const_cast<AABB_tree*>(m_tree_ptr)->accelerate_distance_queries();
}
public:
@ -129,6 +130,7 @@ public:
private:
const FT m_sq_threshold_dist;
mutable const AABB_tree* m_tree_ptr;
mutable std::vector<Triangle> m_input_triangles;
const BasePlacement m_base_placement;
};

View File

@ -62,15 +62,16 @@ int main(int argc, char** argv)
Filtered_placement_with_tree placement_small(0.00005*diag, tree, placement_ref);
SMS::edge_collapse(small_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_small));
Filtered_placement placement_big(50*diag, placement_ref); // lazily builds the AABB tree
Filtered_placement placement_big(0.005*diag, placement_ref); // lazily builds the AABB tree
SMS::edge_collapse(big_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_big));
std::cout << "no filtering: " << vertices(ref_mesh).size() << " vertices left" << std::endl;
std::cout << "large filtering distance: " << vertices(big_mesh).size() << " vertices left" << std::endl;
std::cout << "small filtering distance: " << vertices(small_mesh).size() << " vertices left" << std::endl;
assert(vertices(small_mesh).size() != vertices(ref_mesh).size());
assert(vertices(big_mesh).size() == vertices(ref_mesh).size());
assert(vertices(ref_mesh).size() < vertices(small_mesh).size());
assert(vertices(big_mesh).size() < vertices(small_mesh).size());
assert(vertices(ref_mesh).size() < vertices(big_mesh).size());
return EXIT_SUCCESS;
}