mirror of https://github.com/CGAL/cgal
handle all patches by operations
this workaround issue with boundary non-manifold vertices that we needs to be imported
This commit is contained in:
parent
33fd57c0f1
commit
8ca5971699
|
|
@ -1086,9 +1086,17 @@ void append_patches_to_triangle_mesh(
|
||||||
Triangle_mesh_extension_helper<TriangleMesh, reverse_patch_orientation>
|
Triangle_mesh_extension_helper<TriangleMesh, reverse_patch_orientation>
|
||||||
helper(tm_to_output_edges, tm, output);
|
helper(tm_to_output_edges, tm, output);
|
||||||
|
|
||||||
|
std::vector<std::size_t> ids_of_patches_to_append;
|
||||||
|
ids_of_patches_to_append.reserve(patches_to_append.count());
|
||||||
for (std::size_t i=patches_to_append.find_first();
|
for (std::size_t i=patches_to_append.find_first();
|
||||||
i < patches_to_append.npos;
|
i < patches_to_append.npos;
|
||||||
i = patches_to_append.find_next(i))
|
i = patches_to_append.find_next(i))
|
||||||
|
{
|
||||||
|
ids_of_patches_to_append.push_back(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<halfedge_descriptor> interior_vertex_halfedges;
|
||||||
|
for (std::size_t i : ids_of_patches_to_append)
|
||||||
{
|
{
|
||||||
#ifdef CGAL_COREFINEMENT_POLYHEDRA_DEBUG
|
#ifdef CGAL_COREFINEMENT_POLYHEDRA_DEBUG
|
||||||
#warning the size of tm_to_output_edges will increase at each step \
|
#warning the size of tm_to_output_edges will increase at each step \
|
||||||
|
|
@ -1099,8 +1107,6 @@ void append_patches_to_triangle_mesh(
|
||||||
|
|
||||||
Patch_description<TriangleMesh>& patch = patches[i];
|
Patch_description<TriangleMesh>& patch = patches[i];
|
||||||
|
|
||||||
std::vector<halfedge_descriptor> interior_vertex_halfedges;
|
|
||||||
|
|
||||||
//insert interior halfedges and create interior vertices
|
//insert interior halfedges and create interior vertices
|
||||||
for(halfedge_descriptor h : patch.interior_edges)
|
for(halfedge_descriptor h : patch.interior_edges)
|
||||||
{
|
{
|
||||||
|
|
@ -1146,6 +1152,11 @@ void append_patches_to_triangle_mesh(
|
||||||
interior_vertex_halfedges.push_back( new_h_opp );
|
interior_vertex_halfedges.push_back( new_h_opp );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::size_t i : ids_of_patches_to_append)
|
||||||
|
{
|
||||||
|
Patch_description<TriangleMesh>& patch = patches[i];
|
||||||
|
|
||||||
//create faces and connect halfedges
|
//create faces and connect halfedges
|
||||||
for(face_descriptor f : patch.faces)
|
for(face_descriptor f : patch.faces)
|
||||||
|
|
@ -1164,20 +1175,24 @@ void append_patches_to_triangle_mesh(
|
||||||
set_face(hedges[i], new_f, output);
|
set_face(hedges[i], new_f, output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// handle interior edges that are on the border of the mesh:
|
// handle interior edges that are on the border of the mesh:
|
||||||
// they do not have a prev/next pointer set since only the pointers
|
// they do not have a prev/next pointer set since only the pointers
|
||||||
// of patch interior halfedges part a face have been. In the following
|
// of patch interior halfedges part a face have been. In the following
|
||||||
// (i) we set the next/prev pointer around interior vertices on the mesh
|
// (i) we set the next/prev pointer around interior vertices on the mesh
|
||||||
// boundary and (ii) we collect interior mesh border halfedges incident to
|
// boundary and (ii) we collect interior mesh border halfedges incident to
|
||||||
// a patch border vertex and set their next/prev pointer (possibly of
|
// a patch border vertex and set their next/prev pointer (possibly of
|
||||||
// another patch)
|
// another patch)
|
||||||
|
|
||||||
// Containers used for step (ii) for collecting mesh border halfedges
|
// Containers used for step (ii) for collecting mesh border halfedges
|
||||||
// with source/target on an intersection polyline that needs it prev/next
|
// with source/target on an intersection polyline that needs it prev/next
|
||||||
// pointer to be set
|
// pointer to be set
|
||||||
std::vector<halfedge_descriptor> border_halfedges_source_to_link;
|
std::vector<halfedge_descriptor> border_halfedges_source_to_link;
|
||||||
std::vector<halfedge_descriptor> border_halfedges_target_to_link;
|
std::vector<halfedge_descriptor> border_halfedges_target_to_link;
|
||||||
|
for (std::size_t i : ids_of_patches_to_append)
|
||||||
|
{
|
||||||
|
Patch_description<TriangleMesh>& patch = patches[i];
|
||||||
for(halfedge_descriptor h : patch.interior_edges)
|
for(halfedge_descriptor h : patch.interior_edges)
|
||||||
if (is_border_edge(h,tm))
|
if (is_border_edge(h,tm))
|
||||||
{
|
{
|
||||||
|
|
@ -1204,41 +1219,46 @@ void append_patches_to_triangle_mesh(
|
||||||
CGAL_assertion(is_border(h_out,output) && is_border(h_out_next,output));
|
CGAL_assertion(is_border(h_out,output) && is_border(h_out_next,output));
|
||||||
set_next(h_out, h_out_next, output);
|
set_next(h_out, h_out_next, output);
|
||||||
}
|
}
|
||||||
// now the step (ii) we look for the candidate halfedge by turning around
|
}
|
||||||
// the vertex in the direction of the interior of the patch
|
|
||||||
for(halfedge_descriptor h_out : border_halfedges_target_to_link)
|
|
||||||
{
|
|
||||||
halfedge_descriptor candidate =
|
|
||||||
opposite(prev(opposite(h_out, output), output), output);
|
|
||||||
CGAL_assertion_code(halfedge_descriptor start=candidate);
|
|
||||||
while (!is_border(candidate, output)){
|
|
||||||
candidate=opposite(prev(candidate, output), output);
|
|
||||||
CGAL_assertion(candidate!=start);
|
|
||||||
}
|
|
||||||
set_next(h_out, candidate, output);
|
|
||||||
}
|
|
||||||
for(halfedge_descriptor h_out : border_halfedges_source_to_link)
|
|
||||||
{
|
|
||||||
halfedge_descriptor candidate =
|
|
||||||
opposite(next(opposite(h_out, output), output), output);
|
|
||||||
while (!is_border(candidate, output))
|
|
||||||
candidate = opposite(next(candidate, output), output);
|
|
||||||
set_next(candidate, h_out, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
// For all interior vertices, update the vertex pointer
|
// now the step (ii) we look for the candidate halfedge by turning around
|
||||||
// of all but the vertex halfedge
|
// the vertex in the direction of the interior of the patch
|
||||||
for(halfedge_descriptor h_out : interior_vertex_halfedges)
|
for(halfedge_descriptor h_out : border_halfedges_target_to_link)
|
||||||
{
|
{
|
||||||
vertex_descriptor v = target(h_out, output);
|
halfedge_descriptor candidate =
|
||||||
halfedge_descriptor next_around_vertex=h_out;
|
opposite(prev(opposite(h_out, output), output), output);
|
||||||
do{
|
CGAL_assertion_code(halfedge_descriptor start=candidate);
|
||||||
CGAL_assertion(next(next_around_vertex, output) != GT::null_halfedge());
|
while (!is_border(candidate, output)){
|
||||||
next_around_vertex=opposite(next(next_around_vertex, output), output);
|
candidate=opposite(prev(candidate, output), output);
|
||||||
set_target(next_around_vertex, v, output);
|
CGAL_assertion(candidate!=start);
|
||||||
}while(h_out != next_around_vertex);
|
|
||||||
}
|
}
|
||||||
|
set_next(h_out, candidate, output);
|
||||||
|
}
|
||||||
|
for(halfedge_descriptor h_out : border_halfedges_source_to_link)
|
||||||
|
{
|
||||||
|
halfedge_descriptor candidate =
|
||||||
|
opposite(next(opposite(h_out, output), output), output);
|
||||||
|
while (!is_border(candidate, output))
|
||||||
|
candidate = opposite(next(candidate, output), output);
|
||||||
|
set_next(candidate, h_out, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For all interior vertices, update the vertex pointer
|
||||||
|
// of all but the vertex halfedge
|
||||||
|
for(halfedge_descriptor h_out : interior_vertex_halfedges)
|
||||||
|
{
|
||||||
|
vertex_descriptor v = target(h_out, output);
|
||||||
|
halfedge_descriptor next_around_vertex=h_out;
|
||||||
|
do{
|
||||||
|
CGAL_assertion(next(next_around_vertex, output) != GT::null_halfedge());
|
||||||
|
next_around_vertex=opposite(next(next_around_vertex, output), output);
|
||||||
|
set_target(next_around_vertex, v, output);
|
||||||
|
}while(h_out != next_around_vertex);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::size_t i : ids_of_patches_to_append)
|
||||||
|
{
|
||||||
|
Patch_description<TriangleMesh>& patch = patches[i];
|
||||||
// For all patch boundary vertices, update the vertex pointer
|
// For all patch boundary vertices, update the vertex pointer
|
||||||
// of all but the vertex halfedge
|
// of all but the vertex halfedge
|
||||||
for(halfedge_descriptor h : patch.shared_edges)
|
for(halfedge_descriptor h : patch.shared_edges)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue