Lagrange
Loading...
Searching...
No Matches
Mesh cleanup

Mesh cleanup and repair utilities. More...

Classes

struct  CloseSmallHolesOptions
 Option struct for closing small holes. More...
 
struct  RemoveDuplicateFacetOptions
 Options for remove_duplicate_facets. More...
 
struct  RemoveDuplicateVerticesOptions
 Option struct for remove_duplicate_vertices. More...
 
struct  RemoveNullAreaFacetsOptions
 Option struct for remove_null_area_facets. More...
 
struct  RescaleUVOptions
 
struct  SplitLongEdgesOptions
 
struct  UnflipUVOptions
 

Functions

template<typename Scalar, typename Index>
void close_small_holes (SurfaceMesh< Scalar, Index > &mesh, CloseSmallHolesOptions options={})
 Close small topological holes.
 
template<typename Scalar, typename Index>
std::vector< Index > detect_degenerate_facets (const SurfaceMesh< Scalar, Index > &mesh)
 Detects degenerate facets in a mesh.
 
template<typename Scalar, typename Index>
void remove_degenerate_facets (SurfaceMesh< Scalar, Index > &mesh)
 Removes degenerate facets from a mesh.
 
template<typename Scalar, typename Index>
void remove_duplicate_facets (SurfaceMesh< Scalar, Index > &mesh, const RemoveDuplicateFacetOptions &opts={})
 Remove duplicate facets in the mesh.
 
template<typename Scalar, typename Index>
void remove_duplicate_vertices (SurfaceMesh< Scalar, Index > &mesh, const RemoveDuplicateVerticesOptions &options={})
 Removes duplicate vertices from a mesh.
 
template<typename Scalar, typename Index>
void remove_isolated_vertices (SurfaceMesh< Scalar, Index > &mesh)
 Removes isolated vertices of a mesh.
 
template<typename Scalar, typename Index>
void remove_null_area_facets (SurfaceMesh< Scalar, Index > &mesh, const RemoveNullAreaFacetsOptions &options={})
 Removes all facets with unsigned area <= options.null_area_threshold.
 
template<typename Scalar, typename Index>
void remove_short_edges (SurfaceMesh< Scalar, Index > &mesh, Scalar threshold=0)
 Collapse all edges shorter than a given tolerance.
 
template<typename Scalar, typename Index>
void remove_topologically_degenerate_facets (SurfaceMesh< Scalar, Index > &mesh)
 Remove topologically degenerate facets (i.e.
 
template<typename Scalar, typename Index>
void rescale_uv_charts (SurfaceMesh< Scalar, Index > &mesh, const RescaleUVOptions &options={})
 Rescale UV charts such that they are isotropic to their 3D images.
 
template<typename Scalar, typename Index>
void resolve_nonmanifoldness (SurfaceMesh< Scalar, Index > &mesh)
 Resolve both non-manifold vertices and non-manifold edges in the input mesh.
 
template<typename Scalar, typename Index>
void resolve_vertex_nonmanifoldness (SurfaceMesh< Scalar, Index > &mesh)
 Resolve nonmanifold vertices by pulling disconnected 1-ring neighborhood apart.
 
template<typename Scalar, typename Index>
void split_long_edges (SurfaceMesh< Scalar, Index > &mesh, SplitLongEdgesOptions options={})
 Split edges that are longer than options.max_edge_length.
 
template<typename Scalar, typename Index>
void unflip_uv_triangles (SurfaceMesh< Scalar, Index > &mesh, const UnflipUVOptions &options={})
 Unflip flipped UV triangles.
 

Detailed Description

Mesh cleanup and repair utilities.

Function Documentation

◆ close_small_holes()

template<typename Scalar, typename Index>
void close_small_holes ( SurfaceMesh< Scalar, Index > & mesh,
CloseSmallHolesOptions options = {} )

#include <lagrange/mesh_cleanup/close_small_holes.h>

Close small topological holes.

Parameters
[in,out]meshInput mesh whose holes to close in place.
[in]optionsOptional arguments to control hole closing.

◆ detect_degenerate_facets()

template<typename Scalar, typename Index>
std::vector< Index > detect_degenerate_facets ( const SurfaceMesh< Scalar, Index > & mesh)

#include <lagrange/mesh_cleanup/detect_degenerate_facets.h>

Detects degenerate facets in a mesh.

Parameters
meshInput mesh.
Template Parameters
ScalarMesh scalar type.
IndexMesh index type.
Returns
A vector of indices of degenerate facets.
Note
Only exactly degenerate facets are detected. For polygonal facets, degeneracy is defined as all vertices are colinear.
See also
remove_degenerate_facets

◆ remove_degenerate_facets()

template<typename Scalar, typename Index>
void remove_degenerate_facets ( SurfaceMesh< Scalar, Index > & mesh)

#include <lagrange/mesh_cleanup/remove_degenerate_facets.h>

Removes degenerate facets from a mesh.

Note
This method currently only works with triangular meshes. Only exactly degenerate facets are detected.
Parameters
[in,out]meshInput mesh which will be modified in place.
Note
The current method assumes input mesh is triangular. Use triangulate_polygonal_facets if the input mesh is not triangular. Non-degenerate facets adjacent to degenerate facets may be re-triangulated as a result of the removal.

◆ remove_duplicate_facets()

template<typename Scalar, typename Index>
void remove_duplicate_facets ( SurfaceMesh< Scalar, Index > & mesh,
const RemoveDuplicateFacetOptions & opts = {} )

#include <lagrange/mesh_cleanup/remove_duplicate_facets.h>

Remove duplicate facets in the mesh.

Template Parameters
ScalarMesh scalar type
IndexMesh index type

@paramp[in,out] mesh Input mesh

Parameters
[in]optsOptions
Note
If opts.consider_orientation is false, facets with opposite orientations (e.g. (0, 1, 2) and (2, 1, 0)) are considered as duplicates. If the two orientations have equal number of duplicate facets, all of them will be removed. Otherwise, only one facet with the majority orientation will be kept.

◆ remove_duplicate_vertices()

template<typename Scalar, typename Index>
void remove_duplicate_vertices ( SurfaceMesh< Scalar, Index > & mesh,
const RemoveDuplicateVerticesOptions & options = {} )

#include <lagrange/mesh_cleanup/remove_duplicate_vertices.h>

Removes duplicate vertices from a mesh.

Template Parameters
ScalarMesh scalar type
IndexMesh index type
Parameters
[in,out]meshThe mesh to remove duplicate vertices from.
optionsThe options for duplicate vertex detection.

◆ remove_isolated_vertices()

template<typename Scalar, typename Index>
void remove_isolated_vertices ( SurfaceMesh< Scalar, Index > & mesh)

#include <lagrange/mesh_cleanup/remove_isolated_vertices.h>

Removes isolated vertices of a mesh.

Facets incident to any removed vertex will be deleted.

Parameters
meshMesh to modify in place.
Template Parameters
ScalarMesh scalar type.
IndexMesh index type.

◆ remove_null_area_facets()

template<typename Scalar, typename Index>
void remove_null_area_facets ( SurfaceMesh< Scalar, Index > & mesh,
const RemoveNullAreaFacetsOptions & options = {} )

#include <lagrange/mesh_cleanup/remove_null_area_facets.h>

Removes all facets with unsigned area <= options.null_area_threshold.

Template Parameters
ScalarMesh scalar type.
IndexMesh index type.
Parameters
[in,out]meshInput mesh.
[in]optionsOptions settings for removing null area facets.

◆ remove_short_edges()

template<typename Scalar, typename Index>
void remove_short_edges ( SurfaceMesh< Scalar, Index > & mesh,
Scalar threshold = 0 )

#include <lagrange/mesh_cleanup/remove_short_edges.h>

Collapse all edges shorter than a given tolerance.

Parameters
meshInput mesh to be updated in place.
thresholdEdges with length <= threshold will be removed.

◆ remove_topologically_degenerate_facets()

template<typename Scalar, typename Index>
void remove_topologically_degenerate_facets ( SurfaceMesh< Scalar, Index > & mesh)

#include <lagrange/mesh_cleanup/remove_topologically_degenerate_facets.h>

Remove topologically degenerate facets (i.e.

triangles like (0, 1, 1)).

Non-triangle polygons are not handled at the moment.

Template Parameters
ScalarThe surface mesh scalar type.
IndexThe surface mesh index type.
Parameters
[in,out]meshThe surface mesh (for in-place modification).

◆ rescale_uv_charts()

template<typename Scalar, typename Index>
void rescale_uv_charts ( SurfaceMesh< Scalar, Index > & mesh,
const RescaleUVOptions & options = {} )

#include <lagrange/mesh_cleanup/rescale_uv_charts.h>

Rescale UV charts such that they are isotropic to their 3D images.

Parameters
meshInput mesh, which will be modified in place
optionsRescale options

◆ resolve_nonmanifoldness()

template<typename Scalar, typename Index>
void resolve_nonmanifoldness ( SurfaceMesh< Scalar, Index > & mesh)

#include <lagrange/mesh_cleanup/resolve_nonmanifoldness.h>

Resolve both non-manifold vertices and non-manifold edges in the input mesh.

Template Parameters
ScalarMesh scalar type
IndexMesh index type
Parameters
meshInput mesh, which will be updated in place

◆ resolve_vertex_nonmanifoldness()

template<typename Scalar, typename Index>
void resolve_vertex_nonmanifoldness ( SurfaceMesh< Scalar, Index > & mesh)

#include <lagrange/mesh_cleanup/resolve_vertex_nonmanifoldness.h>

Resolve nonmanifold vertices by pulling disconnected 1-ring neighborhood apart.

Template Parameters
ScalarThe scalar type.
IndexThe index type.
Parameters
[in,out]meshThe input mesh, which will be updated in place.
Warning
This function assumes the input mesh contains no nonmanifold edges or inconsistently oriented triangles.

◆ split_long_edges()

template<typename Scalar, typename Index>
void split_long_edges ( SurfaceMesh< Scalar, Index > & mesh,
SplitLongEdgesOptions options = {} )

#include <lagrange/mesh_cleanup/split_long_edges.h>

Split edges that are longer than options.max_edge_length.

Parameters
[in,out]meshInput mesh.
[in]optionsOptional settings.

◆ unflip_uv_triangles()

template<typename Scalar, typename Index>
void unflip_uv_triangles ( SurfaceMesh< Scalar, Index > & mesh,
const UnflipUVOptions & options = {} )

#include <lagrange/mesh_cleanup/unflip_uv_triangles.h>

Unflip flipped UV triangles.

For each flipped UV triangle, the algorithm computes an optimal (negative) scaling factor in U or V coordinates, and applies it to the UV coordinates of the triangle. The triangle may be detached from neighboring triangles if necessary.

Parameters
meshInput mesh, which will be modified in place
optionsUnflip option settings
Note
This algorithm is specifically designed to correct UV triangles that are flipped due to periodic parameterization, such as the cylindrical parameterization of a cylinder, which can result in a strip of flipped UV triangles. It is not intended for handling generic flipped UV triangles. This function should be called after rescale_uv_charts.
See also
rescale_uv_charts