output_meshes_to_medit.h
1/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
2 * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
3 * Author(s): Siargey Kachanovich
4 *
5 * Copyright (C) 2019 Inria
6 *
7 * Modification(s):
8 * - YYYY/MM Author: Description of the modification
9 */
10
11#ifndef IO_OUTPUT_MESHES_TO_MEDIT_H_
12#define IO_OUTPUT_MESHES_TO_MEDIT_H_
13
14#include <gudhi/IO/Mesh_medit.h>
15
16#include <Eigen/Dense>
17
18#include <cstdlib> // for std::size_t
19#include <fstream> // for std::ofstream
20#include <vector>
21#include <type_traits> // for std::enable_if
22#include <tuple> // for std::get
23#include <utility> // for std::make_pair
24
25namespace Gudhi {
26
27namespace coxeter_triangulation {
28
29using Vertex_points = Mesh_medit::Vertex_points;
30using Mesh_elements = Mesh_medit::Mesh_elements;
31using Scalar_field_range = Mesh_medit::Scalar_field_range;
32
33template <std::size_t I = 0, typename... Meshes>
34typename std::enable_if<I == sizeof...(Meshes), void>::type fill_meshes(Vertex_points& vertex_points,
35 Mesh_elements& edges, Mesh_elements& triangles,
36 Mesh_elements& tetrahedra,
37 Scalar_field_range& triangles_scalar_range,
38 Scalar_field_range& tetrahedra_scalar_range,
39 std::size_t index, const Meshes&... meshes) {}
40
41template <std::size_t I = 0, typename... Meshes>
42typename std::enable_if<I != sizeof...(Meshes), void>::type fill_meshes(Vertex_points& vertex_points,
43 Mesh_elements& edges, Mesh_elements& triangles,
44 Mesh_elements& tetrahedra,
45 Scalar_field_range& triangles_scalar_range,
46 Scalar_field_range& tetrahedra_scalar_range,
47 std::size_t index, const Meshes&... meshes) {
48 auto mesh = std::get<I>(std::forward_as_tuple(meshes...));
49 for (const auto& v : mesh.vertex_points) vertex_points.push_back(v);
50 for (const auto& e : mesh.edges) {
51 std::vector<std::size_t> edge;
52 for (const auto& v_i : e.first) edge.push_back(v_i + index);
53 edges.emplace_back(edge, e.second);
54 }
55 for (const auto& t : mesh.triangles) {
56 std::vector<std::size_t> triangle;
57 for (const auto& v_i : t.first) triangle.push_back(v_i + index);
58 triangles.emplace_back(triangle, t.second);
59 }
60 for (const auto& t : mesh.tetrahedra) {
61 std::vector<std::size_t> tetrahedron;
62 for (const auto& v_i : t.first) tetrahedron.push_back(v_i + index);
63 tetrahedra.emplace_back(tetrahedron, t.second);
64 }
65 for (const auto& b : mesh.triangles_scalar_range) triangles_scalar_range.push_back(b);
66 for (const auto& b : mesh.tetrahedra_scalar_range) tetrahedra_scalar_range.push_back(b);
67 fill_meshes<I + 1, Meshes...>(vertex_points, edges, triangles, tetrahedra, triangles_scalar_range,
68 tetrahedra_scalar_range, index + mesh.vertex_points.size(), meshes...);
69}
70
80template <typename... Meshes>
81void output_meshes_to_medit(std::size_t amb_d, std::string file_name, const Meshes&... meshes) {
82 Vertex_points vertex_points;
83 Mesh_elements edges, triangles, tetrahedra;
84 Scalar_field_range triangles_scalar_range, tetrahedra_scalar_range;
85 fill_meshes(vertex_points, edges, triangles, tetrahedra, triangles_scalar_range, tetrahedra_scalar_range, 0,
86 meshes...);
87
88 std::ofstream ofs(file_name + ".mesh", std::ofstream::out);
89 std::ofstream ofs_bb(file_name + ".bb", std::ofstream::out);
90
91 if (amb_d == 2) {
92 ofs << "MeshVersionFormatted 1\nDimension 2\n";
93 ofs_bb << "2 1 ";
94 ofs << "Vertices\n" << vertex_points.size() << "\n";
95 for (auto p : vertex_points) {
96 ofs << p[0] << " " << p[1] << " 2\n";
97 }
98 ofs << "Edges " << edges.size() << "\n";
99 for (auto e : edges) {
100 for (auto v : e.first) ofs << v << " ";
101 ofs << e.second << std::endl;
102 }
103 ofs << "Triangles " << triangles.size() << "\n";
104 for (auto s : triangles) {
105 for (auto v : s.first) {
106 ofs << v << " ";
107 }
108 ofs << s.second << std::endl;
109 }
110
111 ofs_bb << triangles_scalar_range.size() << " 1\n";
112 for (auto& b : triangles_scalar_range) ofs_bb << b << "\n";
113
114 } else {
115 ofs << "MeshVersionFormatted 1\nDimension 3\n";
116 ofs_bb << "3 1 ";
117 ofs << "Vertices\n" << vertex_points.size() << "\n";
118 for (auto p : vertex_points) {
119 ofs << p[0] << " " << p[1] << " " << p[2] << " 2\n";
120 }
121 ofs << "Edges " << edges.size() << "\n";
122 for (auto e : edges) {
123 for (auto v : e.first) ofs << v << " ";
124 ofs << e.second << std::endl;
125 }
126 ofs << "Triangles " << triangles.size() << "\n";
127 for (auto s : triangles) {
128 for (auto v : s.first) {
129 ofs << v << " ";
130 }
131 ofs << s.second << std::endl;
132 }
133 ofs << "Tetrahedra " << tetrahedra.size() << "\n";
134 for (auto s : tetrahedra) {
135 for (auto v : s.first) {
136 ofs << v << " ";
137 }
138 ofs << s.second << std::endl;
139 }
140
141 ofs_bb << triangles_scalar_range.size() + tetrahedra_scalar_range.size() << " 1\n";
142 for (auto& b : triangles_scalar_range) ofs_bb << b << "\n";
143 for (auto& b : tetrahedra_scalar_range) ofs_bb << b << "\n";
144 }
145
146 ofs.close();
147 ofs_bb.close();
148}
149
150} // namespace coxeter_triangulation
151
152} // namespace Gudhi
153
154#endif
void output_meshes_to_medit(std::size_t amb_d, std::string file_name, const Meshes &... meshes)
Outputs a text file with specified meshes that can be visualized in Medit.
Definition: output_meshes_to_medit.h:81
std::vector< Eigen::VectorXd > Vertex_points
Type of a range of vertices.
Definition: Mesh_medit.h:31
std::vector< double > Scalar_field_range
Type of a range of scalar field .
Definition: Mesh_medit.h:40
std::vector< Mesh_element > Mesh_elements
Type of a range of mesh elements.
Definition: Mesh_medit.h:38