Skip to content

Commit c180dc6

Browse files
committed
fix(SurfaceMesh): wrong polygon_adjacent_edge when polygon is degenerated
1 parent 036f609 commit c180dc6

File tree

5 files changed

+45
-50
lines changed

5 files changed

+45
-50
lines changed

src/geode/mesh/core/surface_mesh.cpp

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -274,10 +274,10 @@ namespace geode
274274
public:
275275
Impl( SurfaceMesh& surface )
276276
: polygon_around_vertex_(
277-
surface.vertex_attribute_manager()
278-
.template find_or_create_attribute< VariableAttribute,
279-
PolygonVertex >(
280-
"polygon_around_vertex", PolygonVertex{} ) ),
277+
surface.vertex_attribute_manager()
278+
.template find_or_create_attribute< VariableAttribute,
279+
PolygonVertex >(
280+
"polygon_around_vertex", PolygonVertex{} ) ),
281281
polygons_around_vertex_(
282282
surface.vertex_attribute_manager()
283283
.template find_or_create_attribute< VariableAttribute,
@@ -675,26 +675,23 @@ namespace geode
675675
const auto v1 = polygon_edge_vertex( polygon_edge, 1 );
676676
const auto adj_vertices = polygon_vertices( polygon_adj_id );
677677
const auto nb_edges = adj_vertices.size();
678+
std::vector< PolygonEdge > failed_edges;
678679
for( const auto e : LRange{ nb_edges } )
679680
{
681+
const PolygonEdge polygon_adj_edge{ polygon_adj_id, e };
680682
if( v0 == adj_vertices[e] )
681683
{
682684
const auto enext = e == nb_edges - 1
683685
? 0u
684686
: static_cast< local_index_t >( e + 1 );
685687
if( v1 == adj_vertices[enext] )
686688
{
687-
OPENGEODE_EXCEPTION(
688-
polygon_adjacent( { polygon_adj_id, e } )
689-
== polygon_edge.polygon_id,
690-
absl::StrCat( "[SurfaceMesh::polygon_adjacent_"
691-
"edge] Wrong adjacency with polygons "
692-
"(bijectivity): ",
693-
polygon_edge.polygon_id, " and ", polygon_adj_id,
694-
" (v0 = ", this->point( v0 ).string(),
695-
", v1 = ", this->point( v1 ).string(), ")" ) );
696-
return std::optional< PolygonEdge >{ std::in_place,
697-
polygon_adj_id, e };
689+
if( polygon_adjacent( polygon_adj_edge )
690+
== polygon_edge.polygon_id )
691+
{
692+
return polygon_adj_edge;
693+
}
694+
failed_edges.emplace_back( polygon_adj_edge );
698695
}
699696
}
700697
else if( v1 == adj_vertices[e] )
@@ -704,28 +701,34 @@ namespace geode
704701
: static_cast< local_index_t >( e + 1 );
705702
if( v0 == adj_vertices[enext] )
706703
{
707-
OPENGEODE_EXCEPTION(
708-
polygon_adjacent( { polygon_adj_id, e } )
709-
== polygon_edge.polygon_id,
710-
absl::StrCat( "[SurfaceMesh::polygon_adjacent_"
711-
"edge] Wrong adjacency with polygons "
712-
"(bijectivity): ",
713-
polygon_edge.polygon_id, " and ", polygon_adj_id,
714-
" (v0 = ", this->point( v0 ).string(),
715-
", v1 = ", this->point( v1 ).string(), ")" ) );
716-
return std::optional< PolygonEdge >{ std::in_place,
717-
polygon_adj_id, e };
704+
if( polygon_adjacent( polygon_adj_edge )
705+
== polygon_edge.polygon_id )
706+
{
707+
return polygon_adj_edge;
708+
}
709+
failed_edges.emplace_back( polygon_adj_edge );
718710
}
719711
}
720712
}
721-
throw OpenGeodeException{
722-
"[SurfaceMesh::polygon_adjacent_edge] Wrong "
723-
"adjacency with polygons (different vertices): ",
724-
polygon_edge.polygon_id, " and ", polygon_adj_id,
725-
" (v0 = ", this->point( v0 ).string(),
726-
", v1 = ", this->point( v1 ).string(), ")"
727-
};
728-
return std::nullopt;
713+
if( failed_edges.empty() )
714+
{
715+
throw OpenGeodeException{
716+
"[SurfaceMesh::polygon_adjacent_edge] Wrong "
717+
"adjacency with polygons (different vertices): ",
718+
polygon_edge.string(), " and ", polygon_adj_id,
719+
" (v0 = ", this->point( v0 ).string(),
720+
", v1 = ", this->point( v1 ).string(), ")"
721+
};
722+
}
723+
auto message = absl::StrCat( "[SurfaceMesh::polygon_adjacent_"
724+
"edge] Wrong adjacency with polygons "
725+
"(bijectivity): ",
726+
polygon_edge.string() );
727+
for( const auto& edge : failed_edges )
728+
{
729+
absl::StrAppend( &message, " and ", edge.string() );
730+
}
731+
throw OpenGeodeException{ message };
729732
}
730733

731734
template < index_t dimension >

src/geode/mesh/helpers/detail/curve_merger.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,7 @@ namespace geode
188188
}
189189

190190
template < index_t dimension >
191-
EdgedCurveMerger< dimension >::~EdgedCurveMerger()
192-
{
193-
}
191+
EdgedCurveMerger< dimension >::~EdgedCurveMerger() = default;
194192

195193
template < index_t dimension >
196194
std::unique_ptr< EdgedCurve< dimension > >
@@ -207,8 +205,8 @@ namespace geode
207205
}
208206

209207
template < index_t dimension >
210-
auto EdgedCurveMerger< dimension >::edge_origins( index_t edge ) const
211-
-> const EdgeOrigins&
208+
auto EdgedCurveMerger< dimension >::edge_origins(
209+
index_t edge ) const -> const EdgeOrigins&
212210
{
213211
return impl_->edge_origins( edge );
214212
}

src/geode/mesh/helpers/detail/solid_merger.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,7 @@ namespace geode
275275
}
276276

277277
template < index_t dimension >
278-
SolidMeshMerger< dimension >::~SolidMeshMerger()
279-
{
280-
}
278+
SolidMeshMerger< dimension >::~SolidMeshMerger() = default;
281279

282280
template < index_t dimension >
283281
std::unique_ptr< SolidMesh< dimension > >

src/geode/mesh/helpers/detail/surface_merger.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,7 @@ namespace geode
301301
}
302302

303303
template < index_t dimension >
304-
SurfaceMeshMerger< dimension >::~SurfaceMeshMerger()
305-
{
306-
}
304+
SurfaceMeshMerger< dimension >::~SurfaceMeshMerger() = default;
307305

308306
template < index_t dimension >
309307
std::unique_ptr< SurfaceMesh< dimension > >

src/geode/mesh/helpers/detail/vertex_merger.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,7 @@ namespace geode
168168
}
169169

170170
template < typename Mesh >
171-
VertexMerger< Mesh >::~VertexMerger()
172-
{
173-
}
171+
VertexMerger< Mesh >::~VertexMerger() = default;
174172

175173
template < typename Mesh >
176174
index_t VertexMerger< Mesh >::vertex_in_merged(
@@ -180,8 +178,8 @@ namespace geode
180178
}
181179

182180
template < typename Mesh >
183-
auto VertexMerger< Mesh >::vertex_origins( index_t vertex ) const
184-
-> const VertexOrigins&
181+
auto VertexMerger< Mesh >::vertex_origins(
182+
index_t vertex ) const -> const VertexOrigins&
185183
{
186184
return impl_->vertex_origins( vertex );
187185
}

0 commit comments

Comments
 (0)