From 94a2778372c26f3b90222db5f9129261f007db4a Mon Sep 17 00:00:00 2001 From: Maxim Date: Mon, 8 Nov 2021 17:30:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B7=D0=B0=D1=89=D0=B8=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MeshLoader.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++++--- MeshLoader.h | 16 +++++++----- lw1.cpp | 2 +- 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/MeshLoader.cpp b/MeshLoader.cpp index 520a5da..4996b66 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 e2d7b14..05a0a9a 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 2b84b2f..48a131b 100644 --- a/lw1.cpp +++ b/lw1.cpp @@ -6,7 +6,7 @@ #include "MeshLoader.h" #include "AneuMeshLoader.h" -//!!! Задание на защиту (не удалять!) +//!!! Задание на защиту (не удалять!) ВЫПОЛНЕНО //!!! Реализовать на основе ranges //!!! 1. Отсортировать тетраэдры по их качеству, определяемому как отношение наименьшей высоты к наибольшей грани тетраэдра. //!!! 2. Отобрать первые 10 и вывести в файл с помощью потокового итератора списки ID их вершин. -- GitLab