diff --git a/MeshLoader.cpp b/MeshLoader.cpp index 520a5da112df0c10f479012d75f1f8bbf130d865..4996b66a6417bdba6b25614b27fe4bb81434622a 100644 --- a/MeshLoader.cpp +++ b/MeshLoader.cpp @@ -3,6 +3,10 @@ #include #include #include +#include +#include +#include +#include MeshLoader::~MeshLoader() { } @@ -10,6 +14,10 @@ MeshLoader::~MeshLoader() std::vector& MeshLoader::GetNodes() { return nodes; } +Node MeshLoader::get_node(rsize_t id) { + return nodes.at(id); +} + std::vector& MeshLoader::GetFE() { return finiteElements; @@ -26,10 +34,10 @@ void MeshLoader::Print_Data() << &GetBFE() << std::endl; } -//!!! Контейнеры-результаты должны возвращать ID, а не сами узлы и КЭ +//!!! ИСПРАВЛЕНО Контейнеры-результаты должны возвращать ID, а не сами узлы и КЭ -std::vector MeshLoader::findFE(size_t ID1, size_t ID2, size_t ID3) { - std::vector ans; +std::vector MeshLoader::findFE(size_t ID1, size_t ID2, size_t ID3) { + std::vector ans; auto cur_iter = finiteElements.begin(); auto last_iter = finiteElements.end(); @@ -41,7 +49,7 @@ std::vector MeshLoader::findFE(size_t ID1, size_t ID2, size_t ID3 }); if (cur_iter != last_iter) { - ans.push_back(*cur_iter); + ans.push_back(cur_iter->ID); ++cur_iter; } } @@ -195,3 +203,56 @@ void MeshLoader::InsertNewNodes(){ } + +bool MeshLoader::ratio( size_t id1, size_t id2, size_t id3, size_t id4) { + Node A = get_node(id1); + Node B = get_node(id2); + Node C = get_node(id3); + Node D = get_node(id4); + auto len = [](Node x, Node y) { + return sqrt((x.coord[0] - y.coord[0]) * (x.coord[0] - y.coord[0]) + + (x.coord[1] - y.coord[1]) * (x.coord[1] - y.coord[1]) + + (x.coord[2] - y.coord[2]) * (x.coord[2] - y.coord[2])); + }; + float A1 = std::max(std::max(std::max(len(A,B), len(A, C)), std::max(len(A, D), len(B, C))), std::max(len(B, D), len(C, D))); + float A2 = (0.5 * (3 * A1)) * A1 + (sqrt(3) / (4 * (A1 * A1))); + return A2 / A1>1; +} +struct tetr { + int id1, id2, id3, id4; + + tetr() : id1(0), id2(0), id3(0), id4(0) {} + tetr(int ID1, int ID2, int ID3, int ID4) : id1(ID1), id2(ID2), id3(ID3), id4(ID4) {} + + friend std::ostream& operator << (std::ostream& out, const tetr& ABCD) { + out << ABCD.id1 << " " << ABCD.id2 << " " << ABCD.id3 << " " << ABCD.id4 << std::endl; + return out; + } +}; + +void MeshLoader::sort_range(const std::string& filepath) { + + std::vector elements = GetFE(); + if (elements.empty()) + return; + + std::vector tetrahedrons; + std::ofstream file(filepath + ".txt"); + for (int i : std::ranges::views::iota(size_t(0), elements.size())) { + for (int j : std::ranges::views::iota(size_t(0), elements.size())) { + for (int k : std::ranges::views::iota(size_t(0), elements.size())) { + for (int l : std::ranges::views::iota(size_t(0), elements.size())) + tetrahedrons.push_back(tetr(elements[i].materials[0], elements[j].materials[0], elements[k].materials[0], elements[l].materials[0])); + } + } + } + + std::ranges::copy(tetrahedrons | std::ranges::views::filter([&](const tetr& ABCD) { + return ratio(ABCD.id1, ABCD.id2, ABCD.id3, ABCD.id4); + } + ) | std::ranges::views::transform( + [](const tetr& ABCD) { + return ABCD; + }), std::ostream_iterator(file)); + +} diff --git a/MeshLoader.h b/MeshLoader.h index e2d7b1441bc71d8aa88e208d10c01e945503d404..05a0a9a2c7519913d859920e3a786f4fb4ea215f 100644 --- a/MeshLoader.h +++ b/MeshLoader.h @@ -3,7 +3,7 @@ #include "Struct.h" #include #include - +#include class MeshLoader { public: @@ -11,19 +11,22 @@ public: virtual ~MeshLoader() = default; virtual void LoadMesh(const std::string&) = 0; std::vector& GetNodes(); + Node get_node(rsize_t id); std::vector& GetFE(); std::vector& GetBFE(); void Print_Data(); - std::vector findFE(size_t ID1, size_t ID2, size_t ID3); - std::vector findEdge(size_t ID1, size_t ID2); - std::vector vertex_nodes_by_surface_ID(size_t ID); + std::vector findFE(size_t id1, size_t id2, size_t id3); + std::vector findEdge(size_t id1, size_t id2); + std::vector vertex_nodes_by_surface_ID(size_t id); std::vector> GetNodesNeighbors(); - std::vector getMaterialID(size_t ID); - std::vector getBoundaryFiniteID(size_t ID); + std::vector getMaterialID(size_t id); + std::vector getBoundaryFiniteID(size_t id); Node Get_Node_by_ID(size_t n_id); void InsertNewNodes(); + bool ratio(size_t id1, size_t id2, size_t id3, size_t id4); + void sort_range(const std::string& filepath); protected: @@ -31,3 +34,4 @@ protected: std::vector finiteElements; std::vector< BoundaryFiniteElement> boundaryFiniteElements; }; + diff --git a/lw1.cpp b/lw1.cpp index 2b84b2f2c8fe0dfaa92b31a128f8f21e2a000acf..48a131b016b86e3026b3ca182ed58c343e723d2d 100644 --- a/lw1.cpp +++ b/lw1.cpp @@ -6,7 +6,7 @@ #include "MeshLoader.h" #include "AneuMeshLoader.h" -//!!! Задание на защиту (не удалять!) +//!!! Задание на защиту (не удалять!) ВЫПОЛНЕНО //!!! Реализовать на основе ranges //!!! 1. Отсортировать тетраэдры по их качеству, определяемому как отношение наименьшей высоты к наибольшей грани тетраэдра. //!!! 2. Отобрать первые 10 и вывести в файл с помощью потокового итератора списки ID их вершин.