PolyFEM
Loading...
Searching...
No Matches
MeshUtils.hpp
Go to the documentation of this file.
1#pragma once
2
5#include <geogram/mesh/mesh.h>
6#include <Eigen/Dense>
7#include <vector>
8#include <memory>
9
10namespace polyfem
11{
12
13 namespace mesh
14 {
25 GEO::vec3 mesh_vertex(const GEO::Mesh &M, GEO::index_t v);
26
27 // Compute facet barycenter.
28 //
29 // @param[in] M Input mesh
30 // @param[in] f Facet whose barycenter to compute
31 //
32 // @return Barycenter position in 3D
33 //
34 GEO::vec3 facet_barycenter(const GEO::Mesh &M, GEO::index_t f);
35
36 // Create a new mesh vertex with given coordinates.
37 //
38 // @param M Mesh to modify
39 // @param[in] p New vertex position
40 //
41 // @return Index of the newly created vertex
42 //
43 GEO::index_t mesh_create_vertex(GEO::Mesh &M, const GEO::vec3 &p);
44
51 void compute_element_tags(const GEO::Mesh &M, std::vector<ElementType> &element_tags);
52
59 void orient_normals_2d(GEO::Mesh &M);
60
70 void reorder_mesh(Eigen::MatrixXd &V, Eigen::MatrixXi &F, const Eigen::VectorXi &C, Eigen::VectorXi &R);
71
84 void signed_squared_distances(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F,
85 const Eigen::MatrixXd &P, Eigen::VectorXd &D);
86
94 void to_geogram_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, GEO::Mesh &M);
95 // void to_geogram_mesh_3d(const Eigen::MatrixXd &V, const Eigen::MatrixXi &C, GEO::Mesh &M);
96
105 void from_geogram_mesh(const GEO::Mesh &M, Eigen::MatrixXd &V, Eigen::MatrixXi &F, Eigen::MatrixXi &T);
106
113 void to_geogram_mesh(const Mesh3D &mesh, GEO::Mesh &M);
114
123 double signed_volume(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F);
124
132 void orient_closed_surface(const Eigen::MatrixXd &V, Eigen::MatrixXi &F, bool positive = true);
133
140 void extract_polyhedra(const Mesh3D &mesh, std::vector<std::unique_ptr<GEO::Mesh>> &polys, bool triangulated = false);
141
152 void tertrahedralize_star_shaped_surface(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F,
153 const Eigen::RowVector3d &kernel, Eigen::MatrixXd &OV, Eigen::MatrixXi &OF, Eigen::MatrixXi &OT);
154
166 void sample_surface(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, int num_samples,
167 Eigen::MatrixXd &P, Eigen::MatrixXd *N = nullptr, int num_lloyd = 10, int num_newton = 10);
168
178 void extract_parent_edges(const Eigen::MatrixXd &IV, const Eigen::MatrixXi &IE,
179 const Eigen::MatrixXd &BV, const Eigen::MatrixXi &BE, Eigen::MatrixXi &OE);
180
188 const Eigen::MatrixXd &vertices,
189 const Eigen::MatrixXi &tets,
190 Eigen::MatrixXd &surface_vertices,
191 Eigen::MatrixXi &tris);
192
202 bool read_surface_mesh(const std::string &mesh_path, Eigen::MatrixXd &vertices, Eigen::VectorXi &codim_vertices, Eigen::MatrixXi &codim_edges, Eigen::MatrixXi &faces);
203
205 bool is_planar(const GEO::Mesh &M, const double tol = 1e-5);
206
208 int count_faces(const int dim, const Eigen::MatrixXi &cells);
209
212 void generate_edges(GEO::Mesh &M);
213 } // namespace mesh
214} // namespace polyfem
int V
std::vector< Eigen::VectorXi > faces
bool is_planar(const GEO::Mesh &M, const double tol=1e-5)
Determine if the given mesh is planar (2D or tiny z-range).
Definition MeshUtils.cpp:31
void sample_surface(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, int num_samples, Eigen::MatrixXd &P, Eigen::MatrixXd *N=nullptr, int num_lloyd=10, int num_newton=10)
Samples points on a surface.
void orient_closed_surface(const Eigen::MatrixXd &V, Eigen::MatrixXi &F, bool positive=true)
Orient a triangulated surface to have positive volume.
double signed_volume(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F)
Compute the signed volume of a surface mesh.
void reorder_mesh(Eigen::MatrixXd &V, Eigen::MatrixXi &F, const Eigen::VectorXi &C, Eigen::VectorXi &R)
Reorder vertices of a mesh using color tags, so that vertices are ordered by increasing colors.
void orient_normals_2d(GEO::Mesh &M)
Orient facets of a 2D mesh so that each connected component has positive volume.
void extract_parent_edges(const Eigen::MatrixXd &IV, const Eigen::MatrixXi &IE, const Eigen::MatrixXd &BV, const Eigen::MatrixXi &BE, Eigen::MatrixXi &OE)
Extract a set of edges that are overlap with a set given set of parent edges, using vertices position...
void extract_triangle_surface_from_tets(const Eigen::MatrixXd &vertices, const Eigen::MatrixXi &tets, Eigen::MatrixXd &surface_vertices, Eigen::MatrixXi &tris)
Extract triangular surface from a tetmesh.
GEO::vec3 mesh_vertex(const GEO::Mesh &M, GEO::index_t v)
Retrieve a 3D vector with the position of a given vertex.
Definition MeshUtils.cpp:44
GEO::index_t mesh_create_vertex(GEO::Mesh &M, const GEO::vec3 &p)
Definition MeshUtils.cpp:77
void to_geogram_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, GEO::Mesh &M)
Converts a triangle mesh to a Geogram mesh.
void signed_squared_distances(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const Eigen::MatrixXd &P, Eigen::VectorXd &D)
Computes the signed squared distance from a list of points to a triangle mesh.
GEO::vec3 facet_barycenter(const GEO::Mesh &M, GEO::index_t f)
Definition MeshUtils.cpp:64
void from_geogram_mesh(const GEO::Mesh &M, Eigen::MatrixXd &V, Eigen::MatrixXi &F, Eigen::MatrixXi &T)
Extract simplices from a Geogram mesh.
void tertrahedralize_star_shaped_surface(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const Eigen::RowVector3d &kernel, Eigen::MatrixXd &OV, Eigen::MatrixXi &OF, Eigen::MatrixXi &OT)
Tetrahedralize a star-shaped mesh, with a given point in its kernel.
void generate_edges(GEO::Mesh &M)
assing edges to M
bool read_surface_mesh(const std::string &mesh_path, Eigen::MatrixXd &vertices, Eigen::VectorXi &codim_vertices, Eigen::MatrixXi &codim_edges, Eigen::MatrixXi &faces)
read a surface mesh
void extract_polyhedra(const Mesh3D &mesh, std::vector< std::unique_ptr< GEO::Mesh > > &polys, bool triangulated=false)
Extract polyhedra from a 3D volumetric mesh.
int count_faces(const int dim, const Eigen::MatrixXi &cells)
Count the number of boundary elements (triangles for tetmesh and edges for triangle mesh)
void compute_element_tags(const GEO::Mesh &M, std::vector< ElementType > &element_tags)
Compute the type of each facet in a surface mesh.
Definition MeshUtils.cpp:97