Files
igl/tutorial/709_SLIM/check_mesh_for_issues.cpp
T
Alec Jacobson f3f7879364 Split up larger tutorials (#2237) [ci skip]
* split up 406; cmake

* split up 716

* rm old file

* 716 changes to main

* 709 split up

* missing include

* special syntax for windows ❄️

* stupid windows struct/class

* split up 805

* split up 610)'
2023-08-19 19:19:44 -04:00

45 lines
1.2 KiB
C++

#include "check_mesh_for_issues.h"
#include <iostream>
#include <igl/doublearea.h>
#include <igl/vertex_components.h>
#include <igl/euler_characteristic.h>
#include <igl/is_edge_manifold.h>
#include <igl/adjacency_matrix.h>
#include <Eigen/Sparse>
void check_mesh_for_issues(Eigen::MatrixXd& V, Eigen::MatrixXi& F) {
using namespace std;
Eigen::SparseMatrix<double> A;
igl::adjacency_matrix(F,A);
Eigen::MatrixXi C, Ci;
igl::vertex_components(A, C, Ci);
int connected_components = Ci.rows();
if (connected_components!=1) {
cout << "Error! Input has multiple connected components" << endl; exit(1);
}
int euler_char = igl::euler_characteristic(F);
if (euler_char!=1)
{
cout <<
"Error! Input does not have a disk topology, it's euler char is " <<
euler_char << endl;
exit(1);
}
bool is_edge_manifold = igl::is_edge_manifold(F);
if (!is_edge_manifold) {
cout << "Error! Input is not an edge manifold" << endl; exit(1);
}
Eigen::VectorXd areas; igl::doublearea(V,F,areas);
const double eps = 1e-14;
for (int i = 0; i < areas.rows(); i++) {
if (areas(i) < eps) {
cout << "Error! Input has zero area faces" << endl; exit(1);
}
}
}