fix correspondance between faces

This commit is contained in:
Sébastien Loriot 2023-02-24 14:45:01 +01:00
parent c90d97635d
commit c587df44a6
3 changed files with 79 additions and 26 deletions

View File

@ -222,7 +222,6 @@ namespace impl
{
put(map, pair.first, pair.second);
}
};
template<typename PMAP>

View File

@ -37,6 +37,48 @@ namespace Polygon_mesh_processing {
namespace Planar_segmentation{
template <class PM>
struct Face_map
{
typedef typename boost::property_traits<PM>::value_type key_type;
typedef typename boost::property_traits<PM>::key_type value_type;
typedef value_type reference;
typedef boost::writable_property_map_tag category;
Face_map(PM pm, const std::vector<std::size_t>& triangle_ids)
: pm(pm)
, triangle_ids(triangle_ids)
{}
friend
void put(Face_map m, key_type k, value_type v)
{
put(m.pm, v, m.triangle_ids[k]);
}
PM pm;
const std::vector<std::size_t>& triangle_ids;
};
template <class PM>
struct Vertex_map
{
typedef typename boost::property_traits<PM>::value_type key_type;
typedef typename boost::property_traits<PM>::key_type value_type;
typedef value_type reference;
typedef boost::writable_property_map_tag category;
Vertex_map(PM pm) : pm(pm) {}
friend
void put(Vertex_map m, key_type k, value_type v)
{
put(m.pm, v, k);
}
PM pm;
};
template <class TriangleMesh>
struct Default_visitor
{
@ -49,29 +91,26 @@ struct Triangle_index_tracker_base
typedef boost::graph_traits<TriangleMeshOut> GT;
Triangle_index_tracker_base(VertexCornerMapOut vertex_corner_map)
: vertex_corner_map(vertex_corner_map)
: m_v2v2_map(vertex_corner_map)
{}
decltype(auto)
v2v_oi()
Vertex_map<VertexCornerMapOut> v2v_map()
{
auto l = [this](const std::pair<std::size_t, typename GT::vertex_descriptor>& p)
{
put(vertex_corner_map, p.second, p.first);
};
return boost::make_function_output_iterator(l);
return m_v2v2_map;
}
VertexCornerMapOut vertex_corner_map;
Vertex_map<VertexCornerMapOut> m_v2v2_map;
};
template <class TriangleMeshOut>
struct Triangle_index_tracker_base<TriangleMeshOut, internal_np::Param_not_found>
{
typedef boost::graph_traits<TriangleMeshOut> GT;
using Vmap = Constant_property_map<std::size_t,
typename boost::graph_traits<TriangleMeshOut>::vertex_descriptor>;
Triangle_index_tracker_base(internal_np::Param_not_found) {}
Emptyset_iterator v2v_oi() { return Emptyset_iterator(); }
Vmap v2v_map() { return Vmap(); }
};
template <class TriangleMeshOut, class VertexCornerMapOut, class FacePatchMapOut>
@ -82,7 +121,7 @@ struct Triangle_index_tracker
Triangle_index_tracker(VertexCornerMapOut vertex_corner_map, FacePatchMapOut face_patch_map)
: Triangle_index_tracker_base<TriangleMeshOut, VertexCornerMapOut>(vertex_corner_map)
, face_patch_map(face_patch_map)
, m_f2f_map(face_patch_map, triangle_ids)
{}
std::vector<std::size_t> triangle_ids;
@ -96,17 +135,13 @@ struct Triangle_index_tracker
triangle_ids.resize(triangle_ids.size()+nb_triangles, i);
}
decltype(auto)
f2f_oi()
Face_map<FacePatchMapOut>
f2f_map()
{
auto l = [this](const std::pair<std::size_t, typename GT::face_descriptor>& p)
{
put(face_patch_map, p.second, triangle_ids[p.first]);
};
return boost::make_function_output_iterator(l);
return m_f2f_map;
}
FacePatchMapOut face_patch_map;
Face_map<FacePatchMapOut> m_f2f_map;
};
@ -114,6 +149,9 @@ template <class TriangleMeshOut, class VertexCornerMapOut>
struct Triangle_index_tracker<TriangleMeshOut, VertexCornerMapOut, internal_np::Param_not_found>
: public Triangle_index_tracker_base<TriangleMeshOut, VertexCornerMapOut>
{
using Fmap = Constant_property_map<std::size_t,
typename boost::graph_traits<TriangleMeshOut>::face_descriptor>;
Triangle_index_tracker(VertexCornerMapOut vertex_corner_map,internal_np::Param_not_found)
: Triangle_index_tracker_base<TriangleMeshOut, VertexCornerMapOut>(vertex_corner_map)
{}
@ -121,7 +159,7 @@ struct Triangle_index_tracker<TriangleMeshOut, VertexCornerMapOut, internal_np::
void new_triangle_added_to_patch(std::size_t /*in_patch_id*/) {}
void new_triangles_added_to_patch(std::size_t /*nb_triangles*/, std::size_t /*in_patch_id*/) {}
Emptyset_iterator f2f_oi() { return Emptyset_iterator(); }
Fmap f2f_map() { return Fmap(); }
};
@ -759,8 +797,8 @@ bool decimate_impl(const TriangleMeshIn& tm_in,
visitor(tm_out);
polygon_soup_to_polygon_mesh(corners, triangles, tm_out,
parameters::vertex_to_vertex_output_iterator(t_id_tracker.v2v_oi()).
face_to_face_output_iterator(t_id_tracker.f2f_oi()),
parameters::vertex_to_vertex_map(t_id_tracker.v2v_map()).
face_to_face_map(t_id_tracker.f2f_map()),
parameters::vertex_point_map(vpm_out));
return remeshing_failed;
}

View File

@ -151,15 +151,31 @@ public Q_SLOTS:
if (create_new_item)
{
Mesh out;
typedef boost::property_map<Mesh, CGAL::face_patch_id_t<int> >::type Patch_id_pmap;
Scene_surface_mesh_item* new_item=new Scene_surface_mesh_item();
Mesh& out = *new_item->polyhedron();
Patch_id_pmap in_fpmap = get(CGAL::face_patch_id_t<int>(), pmesh);
Patch_id_pmap out_fpmap = get(CGAL::face_patch_id_t<int>(), out);
CGAL::Polygon_mesh_processing::remesh_planar_patches(pmesh,
out,
CGAL::parameters::cosinus_threshold(cos_threshold));
CGAL::parameters::cosinus_threshold(cos_threshold).face_patch_map(in_fpmap),
CGAL::parameters::face_patch_map(out_fpmap));
Scene_surface_mesh_item* new_item=new Scene_surface_mesh_item(out);
new_item->setName(tr("%1_remeshed").arg(poly_item->name()));
scene->setSelectedItem( scene->addItem(new_item) );
new_item->setItemIsMulticolor(true);
new_item->computeItemColorVectorAutomatically(true);
new_item->invalidateOpenGLBuffers();
Q_EMIT new_item->itemChanged();
poly_item->setItemIsMulticolor(true);
poly_item->computeItemColorVectorAutomatically(true);
poly_item->invalidateOpenGLBuffers();
Q_EMIT poly_item->itemChanged();
}
else
{