43#ifdef ENABLE_POLYHEDRALMESH_SUPPORT
45#include "TetrahedralCuboidGenerator.hh"
47void TetrahedralCuboidGenerator::add_vertices(
Vector const& position,
Vector const& length)
50 vertices_.reserve((size_[0] + 1) * (size_[1] + 1) * (size_[2] + 1));
52 Vector h(length[0] / size_[0], length[1] / size_[1], length[2] / size_[2]);
53 Vector origin = position - 0.5 * length;
55 for (std::size_t k = 0; k < size_[2] + 1; ++k)
56 for (std::size_t j = 0; j < size_[1] + 1; ++j)
57 for (std::size_t i = 0; i < size_[0] + 1; ++i)
58 vertices_.push_back(mesh_->
add_vertex(
Vector(h[0]*i, h[1]*j, h[2]*k) + origin));
61void TetrahedralCuboidGenerator::get_cube_vertices(std::size_t i, std::size_t j, std::size_t k,
62 std::vector<OpenVolumeMesh::VertexHandle>& v)
const
64 v[0] = vertices_[k * (size_[0] + 1) * (size_[1] + 1) + j * (size_[0] + 1) + i];
65 v[1] = vertices_[k * (size_[0] + 1) * (size_[1] + 1) + j * (size_[0] + 1) + i + 1];
66 v[2] = vertices_[k * (size_[0] + 1) * (size_[1] + 1) + (j + 1) * (size_[0] + 1) + i];
67 v[3] = vertices_[k * (size_[0] + 1) * (size_[1] + 1) + (j + 1) * (size_[0] + 1) + i + 1];
68 v[4] = vertices_[(k + 1) * (size_[0] + 1) * (size_[1] + 1) + j * (size_[0] + 1) + i];
69 v[5] = vertices_[(k + 1) * (size_[0] + 1) * (size_[1] + 1) + j * (size_[0] + 1) + i + 1];
70 v[6] = vertices_[(k + 1) * (size_[0] + 1) * (size_[1] + 1) + (j + 1) * (size_[0] + 1) + i];
71 v[7] = vertices_[(k + 1) * (size_[0] + 1) * (size_[1] + 1) + (j + 1) * (size_[0] + 1) + i + 1];
74void TetrahedralCuboidGenerator::add_faces()
76 std::vector<OpenVolumeMesh::VertexHandle> v(8);
78 for (std::size_t i = 0; i < size_[0]; ++i)
79 for (std::size_t j = 0; j < size_[1]; ++j)
80 for (std::size_t k = 0; k < size_[2]; ++k)
82 get_cube_vertices(i, j, k, v);
84 if ((i + j + k) % 2 == 0)
85 add_cube_type_1_faces(i, j, k, v);
87 add_cube_type_2_faces(i, j, k, v);
91void TetrahedralCuboidGenerator::add_cube_type_1_faces(std::size_t i, std::size_t j, std::size_t k,
92 std::vector<OpenVolumeMesh::VertexHandle>
const& v)
94 std::vector<OpenVolumeMesh::VertexHandle> fv(3);
97 fv[0] = v[0]; fv[1] = v[2]; fv[2] = v[6];
99 fv[0] = v[0]; fv[1] = v[6]; fv[2] = v[4];
103 fv[0] = v[0]; fv[1] = v[4]; fv[2] = v[5];
105 fv[0] = v[0]; fv[1] = v[5]; fv[2] = v[1];
109 fv[0] = v[0]; fv[1] = v[1]; fv[2] = v[3];
111 fv[0] = v[0]; fv[1] = v[3]; fv[2] = v[2];
115 fv[0] = v[0]; fv[1] = v[5]; fv[2] = v[6];
117 fv[0] = v[0]; fv[1] = v[3]; fv[2] = v[5];
119 fv[0] = v[0]; fv[1] = v[6]; fv[2] = v[3];
121 fv[0] = v[3]; fv[1] = v[6]; fv[2] = v[5];
125 if (i == size_[0] - 1) {
126 fv[0] = v[3]; fv[1] = v[5]; fv[2] = v[1];
128 fv[0] = v[3]; fv[1] = v[7]; fv[2] = v[5];
133 if (j == size_[1] - 1) {
134 fv[0] = v[3]; fv[1] = v[6]; fv[2] = v[7];
136 fv[0] = v[3]; fv[1] = v[2]; fv[2] = v[6];
141 if (k == size_[2] - 1) {
142 fv[0] = v[5]; fv[1] = v[6]; fv[2] = v[4];
144 fv[0] = v[5]; fv[1] = v[7]; fv[2] = v[6];
149void TetrahedralCuboidGenerator::add_cube_type_2_faces(std::size_t i, std::size_t j, std::size_t k,
150 std::vector<OpenVolumeMesh::VertexHandle>
const& v)
152 std::vector<OpenVolumeMesh::VertexHandle> fv(3);
155 fv[0] = v[0]; fv[1] = v[2]; fv[2] = v[4];
157 fv[0] = v[2]; fv[1] = v[6]; fv[2] = v[4];
161 fv[0] = v[0]; fv[1] = v[4]; fv[2] = v[1];
163 fv[0] = v[4]; fv[1] = v[5]; fv[2] = v[1];
167 fv[0] = v[0]; fv[1] = v[1]; fv[2] = v[2];
169 fv[0] = v[1]; fv[1] = v[3]; fv[2] = v[2];
173 fv[0] = v[1]; fv[1] = v[7]; fv[2] = v[4];
175 fv[0] = v[1]; fv[1] = v[2]; fv[2] = v[7];
177 fv[0] = v[2]; fv[1] = v[4]; fv[2] = v[7];
179 fv[0] = v[1]; fv[1] = v[4]; fv[2] = v[2];
183 if (i == size_[0] - 1) {
184 fv[0] = v[1]; fv[1] = v[7]; fv[2] = v[5];
186 fv[0] = v[1]; fv[1] = v[3]; fv[2] = v[7];
191 if (j == size_[1] - 1) {
192 fv[0] = v[2]; fv[1] = v[7]; fv[2] = v[3];
194 fv[0] = v[2]; fv[1] = v[6]; fv[2] = v[7];
199 if (k == size_[2] - 1) {
200 fv[0] = v[4]; fv[1] = v[7]; fv[2] = v[6];
202 fv[0] = v[4]; fv[1] = v[5]; fv[2] = v[7];
207void TetrahedralCuboidGenerator::add_cells()
209 std::vector<OpenVolumeMesh::VertexHandle> v(8);
211 for (std::size_t i = 0; i < size_[0]; ++i)
212 for (std::size_t j = 0; j < size_[1]; ++j)
213 for (std::size_t k = 0; k < size_[2]; ++k)
215 get_cube_vertices(i, j, k, v);
217 if ((i + j + k) % 2 == 0)
218 add_cube_type_1_cells(i, j, k, v);
220 add_cube_type_2_cells(i, j, k, v);
224void TetrahedralCuboidGenerator::add_cube_type_1_cells(std::size_t i, std::size_t j, std::size_t k,
225 std::vector<OpenVolumeMesh::VertexHandle>
const& v)
227 std::vector<OpenVolumeMesh::FaceHandle> f(4);
228 std::vector<OpenVolumeMesh::HalfFaceHandle> hf(4);
282void TetrahedralCuboidGenerator::add_cube_type_2_cells(std::size_t i, std::size_t j, std::size_t k,
283 std::vector<OpenVolumeMesh::VertexHandle>
const& v)
285 std::vector<OpenVolumeMesh::FaceHandle> f(4);
286 std::vector<OpenVolumeMesh::HalfFaceHandle> hf(4);
340TetrahedralCuboidGenerator::TetrahedralCuboidGenerator(
PolyhedralMesh& mesh,
345 unsigned const n_z) :
354 add_vertices(position, length);
VertexHandle add_vertex(const VecT &_p)
Add a geometric point to the mesh.
virtual FaceHandle add_face(std::vector< HalfEdgeHandle > _halfedges, bool _topologyCheck=false)
Add face via incident edges.
static HalfFaceHandle halfface_handle(FaceHandle _h, const unsigned char _subIdx)
Conversion function.
virtual CellHandle add_cell(std::vector< HalfFaceHandle > _halffaces, bool _topologyCheck=false)
Add cell via incident halffaces.