4#ifndef MESHBUILDER2D_HPP
5#define MESHBUILDER2D_HPP
19 double t = line_vec.dot(pnt_vec) / line_vec.squaredNorm();
28 return (nearest - pnt_vec).norm();
33 assert(vertices.size() >= 3);
39 double tolerance = 0.5;
44 bool simplex_made =
true;
45 std::size_t its_without_new_simplex = 0;
46 while (vertices.size() > 3)
50 ++its_without_new_simplex;
51 if (its_without_new_simplex > vertices.size())
54 its_without_new_simplex = 0;
60 its_without_new_simplex = 0;
63 std::size_t pos_next = (pos + 1) % vertices.size();
64 std::size_t pos_last = (pos_next + 1) % vertices.size();
85 double new_edge_length = (v1 - v3).norm();
87 if ((new_edge_length > (v1 - v2).norm()) && (new_edge_length > (v2 - v3).norm()))
101 bool vert_in_triangle =
false;
102 for (std::size_t
i = 0;
i < vertices.size(); ++
i)
104 if ((
i == pos) || (
i == pos_next) || (
i == pos_last))
118 vert_in_triangle =
true;
132 vert_in_triangle =
true;
138 if (vert_in_triangle)
144 simplices.push_back(
Simplex<2>({v1, v2, v3}));
145 vertices.erase(vertices.begin() + pos_next);
150 pos = pos_next % (vertices.size() - 1);
153 assert(tolerance > 1E-16);
156 simplices.push_back(
Simplex<2>({vertices[0], vertices[1], vertices[2]}));
184 MeshBuilder(
const std::string mesh_file) : _mesh_file(mesh_file) {}
193 std::vector<std::array<double, 2>> vertices;
194 std::vector<std::vector<size_t>> cells;
196 mesh_reader.read_mesh(vertices, cells);
197 std::transform(vertices.begin(), vertices.end(), vertices.begin(), transformation);
199 if (vertices.size() > 0 && cells.size() > 0)
201 std::unique_ptr<Mesh> mesh = std::make_unique<Mesh>();
202 std::cout <<
"[MeshBuilder] ";
205 for (
auto &v : vertices)
209 mesh->add_vertex(vertex);
213 double total_area = 0.0;
214 for (
auto &c : cells)
216 std::vector<std::size_t> vertex_ids;
217 std::vector<VectorRd> vertex_coords;
218 for (
size_t i = 0;
i < c.size();
i++)
220 vertex_ids.push_back(c[
i] - 1);
221 VectorRd coord(vertices[c[
i] - 1][0], vertices[c[
i] - 1][1]);
222 vertex_coords.push_back(coord);
225 Simplices<2> simplices =
simplexify(vertex_coords);
227 Cell *cell =
new Cell(mesh->n_cells(), simplices);
228 total_area += cell->measure();
229 mesh->add_cell(cell);
231 for (std::size_t
i = 0;
i < vertex_ids.size(); ++
i)
233 std::size_t i_next = (
i + 1) % vertex_ids.size();
235 bool edge_exists =
false;
237 std::vector<Vertex *> vlist = mesh->vertex(vertex_ids[
i])->get_vertices();
238 for (
size_t j = 0;
j < vlist.size();
j++)
240 if (vlist[
j]->global_index() == vertex_ids[i_next])
242 std::vector<Edge *> elist = mesh->vertex(vertex_ids[
i])->get_edges();
243 Edge *edge = elist[
j];
245 cell->add_edge(edge);
246 edge->add_cell(cell);
256 Edge *edge =
new Edge(mesh->n_edges(), Simplex<1>({vertex_coords[i], vertex_coords[i_next]}));
258 mesh->add_edge(edge);
259 cell->add_edge(edge);
260 edge->add_cell(cell);
262 Vertex *vertex1 = mesh->vertex(vertex_ids[
i]);
263 Vertex *vertex2 = mesh->vertex(vertex_ids[i_next]);
265 edge->add_vertex(vertex1);
266 edge->add_vertex(vertex2);
267 vertex1->add_edge(edge);
268 vertex2->add_edge(edge);
269 vertex1->add_vertex(vertex2);
270 vertex2->add_vertex(vertex1);
272 mesh->vertex(vertex_ids[
i])->add_cell(cell);
273 cell->add_vertex(mesh->vertex(vertex_ids[
i]));
276 cell->construct_face_normals();
280 build_boundary(mesh.get());
281 std::cout <<
"added " << mesh->n_cells() <<
" cells; Total area = " << total_area <<
"\n";
287 throw "Cannot build mesh. Check input file";
293 void build_boundary(Mesh *mesh)
295 for (
auto &face : mesh->get_faces())
297 if (face->n_cells() == 1)
299 face->set_boundary(
true);
300 face->get_cells()[0]->set_boundary(
true);
302 for (
auto &vert : face->get_vertices())
304 vert->set_boundary(
true);
307 mesh->add_b_face(face);
312 mesh->add_i_face(face);
316 for (
auto &cell : mesh->get_cells())
318 if (cell->is_boundary())
320 mesh->add_b_cell(cell);
324 mesh->add_i_cell(cell);
328 for (
auto &vert : mesh->get_vertices())
330 if (vert->is_boundary())
332 mesh->add_b_vertex(vert);
336 mesh->add_i_vertex(vert);
340 const std::string _mesh_file;
The MeshBuilder class provides build tools to create a full mesh with all connectivities.
Definition MeshBuilder2D.hpp:172
The MeshReaderTyp2 class provides functions to read a typ2 mesh file.
Definition MeshReaderTyp2.hpp:28
A Vertex is a Polytope with object_dim = 0.
Definition Polytope2D.hpp:54
Compute max and min eigenvalues of all matrices for i
Definition compute_eigs.m:5
Polytope< DIMENSION > Cell
Definition Polytope2D.hpp:151
std::unique_ptr< Mesh > build_the_mesh(const TransformationType &transformation=[](const std::array< double, 2 > &x) { return x;})
Definition MeshBuilder2D.hpp:189
MeshBuilder(const std::string mesh_file)
Definition MeshBuilder2D.hpp:184
Polytope< 1 > Edge
A Face is a Polytope with object_dim = DIMENSION - 1.
Definition Polytope2D.hpp:147
std::function< std::array< double, 2 >(const std::array< double, 2 > &)> TransformationType
Definition MeshBuilder2D.hpp:174
Polytope< 0 > Vertex
An Edge is a Polytope with object_dim = 1.
Definition Polytope2D.hpp:144
MeshBuilder()
Definition MeshBuilder2D.hpp:179
for j
Definition mmread.m:174
double shortest_distance(VectorRd p, VectorRd A, VectorRd B)
Definition MeshBuilder2D.hpp:14
double signed_area(VectorRd A, VectorRd B, VectorRd C)
Definition Mesh2D.hpp:8
std::array< VectorRd, object_dim+1 > Simplex
Definition Polytope2D.hpp:23
Simplices< 2 > simplexify(std::vector< VectorRd > vertices)
Definition MeshBuilder2D.hpp:31
std::vector< Simplex< object_dim > > Simplices
Method to find the center mass of an arbitrary simplex in arbitrary space.
Definition Polytope2D.hpp:28
Eigen::Matrix< double, DIMENSION, 1 > VectorRd
Definition Polytope2D.hpp:19