18 std::array<MeshLib::Node, N>
const& nodes)
20 double min_angle(2 * std::numbers::pi);
21 double max_angle(0.0);
23 for (
decltype(N) i = 0; i < N; ++i)
27 min_angle = std::min(angle, min_angle);
28 max_angle = std::max(angle, max_angle);
30 return {min_angle, max_angle};
54 std::array<double, 4> min;
55 std::array<double, 4> max;
56 for (
auto face_number = 0; face_number < 4; ++face_number)
58 std::unique_ptr<MeshLib::Element const> face{elem.
getFace(face_number)};
59 std::array
const nodes = {*face->getNode(0), *face->getNode(1),
61 std::tie(min[face_number], max[face_number]) =
getMinMaxAngle(nodes);
64 double const min_angle = *std::min_element(min.begin(), min.end());
65 double const max_angle = *std::max_element(max.begin(), max.end());
67 using namespace std::numbers;
68 return std::max((max_angle - pi / 3) / 2, (pi / 3 - min_angle)) * 3 / pi;
73 std::array<double, 6> min;
74 std::array<double, 6> max;
75 for (
auto face_number = 0; face_number < 6; ++face_number)
77 std::unique_ptr<MeshLib::Element const> face{elem.
getFace(face_number)};
78 std::array
const nodes = {*face->getNode(0), *face->getNode(1),
79 *face->getNode(2), *face->getNode(3)};
80 std::tie(min[face_number], max[face_number]) =
getMinMaxAngle(nodes);
83 double const min_angle = *std::min_element(min.begin(), min.end());
84 double const max_angle = *std::max_element(max.begin(), max.end());
86 using namespace std::numbers;
87 return std::max((max_angle - pi / 2), (pi / 2 - min_angle)) * 2 / pi;
93 std::unique_ptr<MeshLib::Element const> f0{elem.
getFace(0)};
94 std::array
const nodes_f0 = {*f0->getNode(0), *f0->getNode(1),
96 auto const& [min_angle_tri0, max_angle_tri0] =
getMinMaxAngle(nodes_f0);
99 std::unique_ptr<MeshLib::Element const> f4{elem.
getFace(4)};
100 std::array
const nodes_f4 = {*f4->getNode(0), *f4->getNode(1),
102 auto const& [min_angle_tri1, max_angle_tri1] =
getMinMaxAngle(nodes_f4);
104 auto const min_angle_tri = std::min(min_angle_tri0, min_angle_tri1);
105 auto const max_angle_tri = std::max(max_angle_tri0, max_angle_tri1);
107 using namespace std::numbers;
108 double const tri_criterion =
109 std::max((max_angle_tri - pi / 3) / 2, (pi / 3 - min_angle_tri)) * 3 /
112 std::array<double, 3> min;
113 std::array<double, 3> max;
114 for (
int i = 1; i < 4; ++i)
116 std::unique_ptr<MeshLib::Element const> f{elem.
getFace(i)};
117 std::array
const nodes = {*f->getNode(0), *f->getNode(1),
118 *f->getNode(2), *f->getNode(3)};
122 double const min_angle_quad = *std::min_element(min.begin(), min.end());
123 double const max_angle_quad = *std::max_element(max.begin(), max.end());
125 using namespace std::numbers;
126 double const quad_criterion =
127 std::max((max_angle_quad - pi / 2), (pi / 2 - min_angle_quad)) * 2 / pi;
129 return std::min(tri_criterion, quad_criterion);