11#ifndef IO_OUTPUT_MESHES_TO_MEDIT_H_
12#define IO_OUTPUT_MESHES_TO_MEDIT_H_
14#include <gudhi/IO/Mesh_medit.h>
27namespace coxeter_triangulation {
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) {}
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);
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);
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);
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...);
80template <
typename... 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,
88 std::ofstream ofs(file_name +
".mesh", std::ofstream::out);
89 std::ofstream ofs_bb(file_name +
".bb", std::ofstream::out);
92 ofs <<
"MeshVersionFormatted 1\nDimension 2\n";
94 ofs <<
"Vertices\n" << vertex_points.size() <<
"\n";
95 for (
auto p : vertex_points) {
96 ofs << p[0] <<
" " << p[1] <<
" 2\n";
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;
103 ofs <<
"Triangles " << triangles.size() <<
"\n";
104 for (
auto s : triangles) {
105 for (
auto v : s.first) {
108 ofs << s.second << std::endl;
111 ofs_bb << triangles_scalar_range.size() <<
" 1\n";
112 for (
auto& b : triangles_scalar_range) ofs_bb << b <<
"\n";
115 ofs <<
"MeshVersionFormatted 1\nDimension 3\n";
117 ofs <<
"Vertices\n" << vertex_points.size() <<
"\n";
118 for (
auto p : vertex_points) {
119 ofs << p[0] <<
" " << p[1] <<
" " << p[2] <<
" 2\n";
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;
126 ofs <<
"Triangles " << triangles.size() <<
"\n";
127 for (
auto s : triangles) {
128 for (
auto v : s.first) {
131 ofs << s.second << std::endl;
133 ofs <<
"Tetrahedra " << tetrahedra.size() <<
"\n";
134 for (
auto s : tetrahedra) {
135 for (
auto v : s.first) {
138 ofs << s.second << std::endl;
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";
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