PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
SphereMeshUtilities.hpp
Go to the documentation of this file.
1// _LICENSE_HEADER_
2//
3// Copyright (C) 2019 - 2025.
4// Terms register on the GPL-3.0 license.
5//
6// This file can be redistributed and/or modified under the license terms.
7//
8// See top level LICENSE file for more details.
9//
10// This file can be used citing references in CITATION.cff file.
11
12#ifndef __SphereMeshUtilities_H
13#define __SphereMeshUtilities_H
14
15#include "GeometryUtilities.hpp"
16#include "MeshMatricesDAO.hpp"
17#include "MeshUtilities.hpp"
18#include <numbers>
19
20namespace Gedim
21{
27{
28 const Gedim::GeometryUtilities &geometryUtilities;
29 const Gedim::MeshUtilities &meshUtilities;
30
31 public:
32 SphereMeshUtilities(const Gedim::GeometryUtilities &geometryUtilities, const Gedim::MeshUtilities &meshUtilities)
33 : geometryUtilities(geometryUtilities), meshUtilities(meshUtilities)
34 {
35 }
36
38
39 Eigen::MatrixXd circle(const Eigen::Vector3d &center, const double &radius, const unsigned int &num_points) const
40 {
41 Eigen::MatrixXd vertices = Eigen::MatrixXd::Zero(3, num_points);
42
43 std::vector<double> th = geometryUtilities.EquispaceCoordinates(num_points + 1, 0.0, 2.0 * std::numbers::pi, true);
44 for (unsigned int i = 0; i < num_points; i++)
45 {
46 vertices(0, i) = radius * cos(th[i]) + center(0);
47 vertices(1, i) = radius * sin(th[i]) + center(1);
48 }
49
50 return vertices;
51 }
52
53 Eigen::MatrixXd ellipse(const Eigen::Vector3d &center,
54 const double &radius_1,
55 const double &radius_2,
56 const double &rotation_angle,
57 const unsigned int &num_points) const
58 {
59 Eigen::MatrixXd vertices = Eigen::MatrixXd::Zero(3, num_points);
60
61 std::vector<double> th = geometryUtilities.EquispaceCoordinates(num_points + 1, 0.0, 2.0 * std::numbers::pi, true);
62
63 const double cos_theta = cos(rotation_angle);
64 const double sin_theta = sin(rotation_angle);
65 for (unsigned int i = 0; i < num_points; i++)
66 {
67 vertices(0, i) = radius_1 * cos_theta * cos(th[i]) - radius_2 * sin_theta * sin(th[i]) + center(0);
68 vertices(1, i) = radius_1 * sin_theta * cos(th[i]) + radius_2 * cos_theta * sin(th[i]) + center(1);
69 }
70
71 return vertices;
72 }
73
74 GeometryUtilities::Polyhedron uv_sphere(const unsigned int &meridians, const unsigned int &parallels) const
75 {
77
79 polyhedron.Vertices = Eigen::MatrixXd::Zero(3, 2 + (parallels - 1) * meridians);
80
81 unsigned int v = 0;
82 polyhedron.Vertices.col(v++) << 0.0, 1.0, 0.0; // add top vertex// add top vertex
83
84 // generate vertices per stack / slice
85 for (int i = 0; i < parallels - 1; i++)
86 {
87 const double phi = std::numbers::pi * double(i + 1) / double(parallels);
88 for (int j = 0; j < meridians; j++)
89 {
90 const double theta = 2.0 * std::numbers::pi * double(j) / double(meridians);
91 polyhedron.Vertices.col(v++) << std::sin(phi) * std::cos(theta), std::cos(phi), std::sin(phi) * std::sin(theta);
92 }
93 }
94
95 // add bottom vertex
96 polyhedron.Vertices.col(v++) << 0.0, -1.0, 0.0;
97
98 const unsigned int idLastVertices = v - 1;
99 std::vector<Eigen::VectorXi> faces;
100
101 // add top / bottom triangles
102 for (unsigned int i = 0; i < meridians; ++i)
103 {
104 Eigen::VectorXi face_top(3);
105 face_top << 0, i + 1, (i + 1) % meridians + 1;
106 faces.push_back(face_top);
107
108 Eigen::VectorXi face_bottom(3);
109 face_bottom << idLastVertices, i + meridians * (parallels - 2) + 1,
110 (i + 1) % meridians + meridians * (parallels - 2) + 1;
111 faces.push_back(face_bottom);
112 }
113
114 // add quads per stack / slice
115 for (unsigned int j = 0; j < parallels - 2; j++)
116 {
117 const unsigned int j0 = j * meridians + 1;
118 const unsigned int j1 = (j + 1) * meridians + 1;
119 for (int i = 0; i < meridians; i++)
120 {
121 const unsigned int i0 = j0 + i;
122 const unsigned int i1 = j0 + (i + 1) % meridians;
123 const unsigned int i2 = j1 + (i + 1) % meridians;
124 const unsigned int i3 = j1 + i;
125
126 Eigen::VectorXi face(4);
127 face << i0, i1, i2, i3;
128 faces.push_back(face);
129 }
130 }
131
133
134 polyhedron.Edges = result.Cell1Ds;
135 polyhedron.Faces = result.Cell2Ds;
136
137 return polyhedron;
138 }
139};
140
141} // namespace Gedim
142
143#endif // __SphereMeshUtilities_H
Eigen column vector.
Definition Eigen_Array.hpp:23
The GeometryUtilities class intersects 3D segments.
Definition GeometryUtilities.hpp:37
MeshUtilities.
Definition MeshUtilities.hpp:23
Gedim::MeshUtilities::ComputeMesh2DCell1DsResult ComputeMesh2DCell1Ds(const Eigen::MatrixXd &cell0Ds, const std::vector< Eigen::VectorXi > &cell2Ds) const
Compute edges in a Mesh 2D with vertices and polygons.
Definition MeshUtilities2D.cpp:195
static void Assert(const bool &logicResult)
Assert for all code, generate exception if something goes wrong.
Definition IOUtilities.hpp:126
MeshUtilities.
Definition SphereMeshUtilities.hpp:27
GeometryUtilities::Polyhedron uv_sphere(const unsigned int &meridians, const unsigned int &parallels) const
Definition SphereMeshUtilities.hpp:74
SphereMeshUtilities(const Gedim::GeometryUtilities &geometryUtilities, const Gedim::MeshUtilities &meshUtilities)
Definition SphereMeshUtilities.hpp:32
virtual ~SphereMeshUtilities()
Definition SphereMeshUtilities.hpp:37
Eigen::MatrixXd circle(const Eigen::Vector3d &center, const double &radius, const unsigned int &num_points) const
Definition SphereMeshUtilities.hpp:39
Eigen::MatrixXd ellipse(const Eigen::Vector3d &center, const double &radius_1, const double &radius_2, const double &rotation_angle, const unsigned int &num_points) const
Definition SphereMeshUtilities.hpp:53
Definition Eigen_Array.cpp:22
Definition GeometryUtilities.hpp:677
Definition MeshUtilities.hpp:120
std::vector< Eigen::MatrixXi > Cell2Ds
Cell1Ds vertices, size 2 x Cell1DTotalNumber()
Definition MeshUtilities.hpp:122
Eigen::MatrixXi Cell1Ds
Definition MeshUtilities.hpp:121