Skip to content

Commit 85ae607

Browse files
committed
added densified pattern for surfaces
1 parent 2e5284e commit 85ae607

File tree

4 files changed

+129
-35
lines changed

4 files changed

+129
-35
lines changed

include/geode/mesh/helpers/convert_surface_mesh.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ namespace geode
5858
[[nodiscard]] std::unique_ptr< TriangulatedSurface2D > opengeode_mesh_api
5959
convert_grid_into_triangulated_surface( const Grid2D& grid );
6060

61+
[[nodiscard]] std::unique_ptr< TriangulatedSurface2D > opengeode_mesh_api
62+
convert_grid_into_densified_triangulated_surface( const Grid2D& grid,
63+
absl::Span< const geode::index_t > cells_to_densify );
64+
6165
template < index_t dimension >
6266
void triangulate_surface_mesh( SurfaceMesh< dimension >& surface );
6367

src/geode/mesh/helpers/convert_solid_mesh.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ namespace
144144
const geode::Grid3D& grid,
145145
absl::Span< const geode::index_t > cells_to_densify )
146146
{
147-
builder.reserve_tetrahedra( 6 * grid.nb_cells() );
147+
builder.reserve_tetrahedra(
148+
6 * grid.nb_cells() + 6 * cells_to_densify.size() );
148149
geode::GenericMapping< geode::index_t > old2new_mapping;
149150
for( const auto k : geode::Range{ grid.nb_cells_in_direction( 2 ) } )
150151
{
@@ -175,7 +176,6 @@ namespace
175176
grid.cell_indices( cells_to_densify[cell_index] );
176177
const auto additional_vertex_id =
177178
grid.nb_grid_vertices() + cell_index;
178-
geode::index_t counter{ 0 };
179179
for( const auto tetra_id : create_tetrahedra_from_pyramid_pattern(
180180
builder, grid, cell_indices, additional_vertex_id ) )
181181
{

src/geode/mesh/helpers/convert_surface_mesh.cpp

Lines changed: 113 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -117,67 +117,141 @@ namespace
117117
template < geode::index_t dimension >
118118
std::unique_ptr< geode::TriangulatedSurface< dimension > >
119119
create_triangulated_surface_from_grid(
120-
const geode::Grid< dimension >& /*unused*/ )
120+
const geode::Grid< dimension >& /*unused*/,
121+
absl::Span< const geode::index_t > /*unused*/ )
121122
{
122123
throw geode::OpenGeodeException{
123124
"[create_triangulated_surface_from_grid] Cannot convert "
124125
"SurfaceMesh from RegularGrid3D"
125126
};
126127
}
127128

129+
std::array< geode::index_t, 4 > create_triangles_from_cross_pattern(
130+
geode::TriangulatedSurfaceBuilder2D& builder,
131+
const geode::Grid2D& grid,
132+
const geode::Grid2D::CellIndices& cell_indices,
133+
geode::index_t additional_vertex_id )
134+
{
135+
const auto cell_vertices = grid.cell_vertices( cell_indices );
136+
std::array< geode::index_t, 4 > cell_mesh_vertices;
137+
for( const auto vertex_id : geode::LIndices{ cell_mesh_vertices } )
138+
{
139+
const auto cell_vertex_id =
140+
grid.vertex_index( cell_vertices[vertex_id] );
141+
cell_mesh_vertices[vertex_id] = cell_vertex_id;
142+
}
143+
std::array< geode::index_t, 4 > created_triangles;
144+
created_triangles[0] = builder.create_triangle( { cell_mesh_vertices[0],
145+
cell_mesh_vertices[1], additional_vertex_id } );
146+
created_triangles[1] = builder.create_triangle( { cell_mesh_vertices[1],
147+
cell_mesh_vertices[3], additional_vertex_id } );
148+
created_triangles[2] = builder.create_triangle( { cell_mesh_vertices[3],
149+
cell_mesh_vertices[2], additional_vertex_id } );
150+
created_triangles[4] = builder.create_triangle( { cell_mesh_vertices[2],
151+
cell_mesh_vertices[0], additional_vertex_id } );
152+
return created_triangles;
153+
}
154+
155+
std::array< geode::index_t, 2 > create_triangles_from_diagonal_pattern(
156+
geode::TriangulatedSurfaceBuilder2D& builder,
157+
const geode::Grid2D& grid,
158+
const geode::Grid2D::CellIndices& cell_indices )
159+
{
160+
const auto cell_vertices = grid.cell_vertices( cell_indices );
161+
std::array< geode::index_t, 4 > cell_mesh_vertices;
162+
for( const auto vertex_id : geode::LIndices{ cell_mesh_vertices } )
163+
{
164+
const auto cell_vertex_id =
165+
grid.vertex_index( cell_vertices[vertex_id] );
166+
cell_mesh_vertices[vertex_id] = cell_vertex_id;
167+
}
168+
std::array< geode::index_t, 2 > created_triangles;
169+
created_triangles[0] = builder.create_triangle( { cell_mesh_vertices[0],
170+
cell_mesh_vertices[1], cell_mesh_vertices[3] } );
171+
created_triangles[1] = builder.create_triangle( { cell_mesh_vertices[0],
172+
cell_mesh_vertices[3], cell_mesh_vertices[2] } );
173+
return created_triangles;
174+
}
175+
128176
void create_triangles_from_grid_cells(
129177
const geode::TriangulatedSurface2D& surface,
130178
geode::TriangulatedSurfaceBuilder2D& builder,
131-
const geode::Grid2D& grid )
179+
const geode::Grid2D& grid,
180+
absl::Span< const geode::index_t > cells_to_densify )
132181
{
133-
builder.reserve_triangles( 2 * grid.nb_cells() );
182+
builder.reserve_triangles(
183+
2 * grid.nb_cells() + 2 * cells_to_densify.size() );
134184
geode::GenericMapping< geode::index_t > old2new_mapping;
135185
for( const auto j : geode::Range{ grid.nb_cells_in_direction( 1 ) } )
136186
{
137187
for( const auto i :
138188
geode::Range{ grid.nb_cells_in_direction( 0 ) } )
139189
{
140-
const auto cell_vertices = grid.cell_vertices( { i, j } );
141190
const auto cell = grid.cell_index( { i, j } );
142-
std::array< geode::index_t, 4 > cell_mesh_vertices;
143-
for( const auto v : geode::LIndices{ cell_mesh_vertices } )
191+
if( absl::c_find( cells_to_densify, cell )
192+
!= cells_to_densify.end() )
193+
{
194+
continue;
195+
}
196+
for( const auto triangle_id :
197+
create_triangles_from_diagonal_pattern(
198+
builder, grid, { i, j } ) )
144199
{
145-
const auto cell_vertex_id =
146-
grid.vertex_index( cell_vertices[v] );
147-
cell_mesh_vertices[v] = cell_vertex_id;
200+
old2new_mapping.map( cell, triangle_id );
148201
}
149-
const auto triangle0 =
150-
builder.create_triangle( { cell_mesh_vertices[0],
151-
cell_mesh_vertices[1], cell_mesh_vertices[3] } );
152-
const auto triangle1 =
153-
builder.create_triangle( { cell_mesh_vertices[0],
154-
cell_mesh_vertices[3], cell_mesh_vertices[2] } );
155-
builder.set_polygon_adjacent( { triangle0, 2 }, triangle1 );
156-
builder.set_polygon_adjacent( { triangle1, 0 }, triangle0 );
157-
old2new_mapping.map( cell, triangle0 );
158-
old2new_mapping.map( cell, triangle1 );
202+
}
203+
}
204+
for( const auto cell_index : geode::Indices{ cells_to_densify } )
205+
{
206+
const auto cell_indices =
207+
grid.cell_indices( cells_to_densify[cell_index] );
208+
const auto additional_vertex_id =
209+
grid.nb_grid_vertices() + cell_index;
210+
for( const auto triangle_id : create_triangles_from_cross_pattern(
211+
builder, grid, cell_indices, additional_vertex_id ) )
212+
{
213+
old2new_mapping.map(
214+
cells_to_densify[cell_index], triangle_id );
159215
}
160216
}
161217
builder.compute_polygon_adjacencies();
162218
surface.polygon_attribute_manager().import(
163219
grid.cell_attribute_manager(), old2new_mapping );
164220
}
165221

222+
void create_vertices_from_grid( const geode::TriangulatedSurface2D& surface,
223+
geode::TriangulatedSurfaceBuilder2D& builder,
224+
const geode::Grid2D& grid,
225+
absl::Span< const geode::index_t > cells_to_densify )
226+
{
227+
builder.create_vertices(
228+
grid.nb_grid_vertices() + cells_to_densify.size() );
229+
for( const auto vertex_id : geode::Range{ grid.nb_grid_vertices() } )
230+
{
231+
builder.set_point( vertex_id,
232+
grid.grid_point( grid.vertex_indices( vertex_id ) ) );
233+
}
234+
geode::index_t counter{ grid.nb_grid_vertices() };
235+
for( const auto cell_id : cells_to_densify )
236+
{
237+
builder.set_point(
238+
counter, grid.cell_barycenter( grid.cell_indices( cell_id ) ) );
239+
counter++;
240+
}
241+
geode::internal::copy_attributes( grid.grid_vertex_attribute_manager(),
242+
surface.vertex_attribute_manager() );
243+
}
244+
166245
template <>
167246
std::unique_ptr< geode::TriangulatedSurface2D >
168-
create_triangulated_surface_from_grid( const geode::Grid2D& grid )
247+
create_triangulated_surface_from_grid( const geode::Grid2D& grid,
248+
absl::Span< const geode::index_t > cells_to_densify )
169249
{
170250
auto surface = geode::TriangulatedSurface2D::create();
171251
auto builder = geode::TriangulatedSurfaceBuilder2D::create( *surface );
172-
builder->create_vertices( grid.nb_grid_vertices() );
173-
for( const auto v : geode::Range{ grid.nb_grid_vertices() } )
174-
{
175-
builder->set_point(
176-
v, grid.grid_point( grid.vertex_indices( v ) ) );
177-
}
178-
geode::internal::copy_attributes( grid.grid_vertex_attribute_manager(),
179-
surface->vertex_attribute_manager() );
180-
create_triangles_from_grid_cells( *surface, *builder, grid );
252+
create_vertices_from_grid( *surface, *builder, grid, cells_to_densify );
253+
create_triangles_from_grid_cells(
254+
*surface, *builder, grid, cells_to_densify );
181255
return surface;
182256
}
183257
} // namespace
@@ -211,8 +285,8 @@ namespace geode
211285
{
212286
std::optional< std::unique_ptr< TriangulatedSurface< dimension > > >
213287
result{ create_triangulated_surface_from_grid(
214-
dynamic_cast< const RegularGrid< dimension >& >(
215-
surface ) ) };
288+
dynamic_cast< const RegularGrid< dimension >& >( surface ),
289+
{} ) };
216290
auto builder = TriangulatedSurfaceBuilder< dimension >::create(
217291
*result->get() );
218292
internal::copy_meta_info( surface, *builder );
@@ -233,7 +307,14 @@ namespace geode
233307
std::unique_ptr< TriangulatedSurface2D >
234308
convert_grid_into_triangulated_surface( const Grid2D& grid )
235309
{
236-
return create_triangulated_surface_from_grid( grid );
310+
return create_triangulated_surface_from_grid( grid, {} );
311+
}
312+
313+
std::unique_ptr< TriangulatedSurface2D >
314+
convert_grid_into_densified_triangulated_surface( const Grid2D& grid,
315+
absl::Span< const geode::index_t > cells_to_densify )
316+
{
317+
return create_triangulated_surface_from_grid( grid, cells_to_densify );
237318
}
238319

239320
template < index_t dimension >

tests/mesh/test-convert-surface.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,18 @@ void test()
7373

7474
geode::LightRegularGrid2D grid{ geode::Point2D{ { 1, 2 } }, { 5, 6 },
7575
{ 1, 1 } };
76+
const std::array< geode::index_t, 4 > cells_to_densify{ 5, 11, 12, 13 };
7677
const auto converted_grid2d =
7778
geode::convert_grid_into_triangulated_surface( grid );
78-
OPENGEODE_EXCEPTION( converted_grid2d->nb_polygons() == 5 * 6 * 2,
79+
const auto converted_grid2d_densified =
80+
geode::convert_grid_into_densified_triangulated_surface(
81+
grid, cells_to_densify );
82+
OPENGEODE_EXCEPTION( converted_grid2d->nb_polygons() == grid.nb_cells() * 2,
83+
"[Test] Number of polygons in TriangulatedSurface2D from grid is not "
84+
"correct." );
85+
OPENGEODE_EXCEPTION(
86+
converted_grid2d_densified->nb_polygons()
87+
== grid.nb_cells() * 2 + 2 * cells_to_densify.size(),
7988
"[Test] Number of polygons in TriangulatedSurface2D from grid is not "
8089
"correct." );
8190
}

0 commit comments

Comments
 (0)