diff --git a/MeshLoader.cpp b/MeshLoader.cpp index c0d5ebf738a9213c17b573269c0946309ed658bf..03e6a92032eeb0a28b7ebf12c156e01a85c47f5f 100644 --- a/MeshLoader.cpp +++ b/MeshLoader.cpp @@ -7,10 +7,7 @@ #include #include #include - -MeshLoader::~MeshLoader() //!!! У деструктора указан =default. Зачем тут это определение? -{ -} +#include std::vector& MeshLoader::GetNodes() { return nodes; @@ -43,10 +40,10 @@ std::vector MeshLoader::findFE(size_t ID1, size_t ID2, size_t ID3) { auto last_iter = finiteElements.end(); while (cur_iter != last_iter) { - cur_iter = std::find_if(cur_iter, last_iter, [ID1, ID2, ID3](FiniteElement& cur_elem) { //!!!cur_elem изменяется? Где const? - return std::find(cur_elem.materials.begin(), cur_elem.materials.end(), ID1) != cur_elem.materials.end() - && std::find(cur_elem.materials.begin(), cur_elem.materials.end(), ID2) != cur_elem.materials.end() - && std::find(cur_elem.materials.begin(), cur_elem.materials.end(), ID3) != cur_elem.materials.end(); + cur_iter = std::find_if(cur_iter, last_iter, [ID1, ID2, ID3](const FiniteElement& cur_elem) { //!!!ИСПРАВЛЕНО cur_elem изменяется? Где const? + return std::find(cur_elem.id_vertices.begin(), cur_elem.id_vertices.end(), ID1) != cur_elem.id_vertices.end() + && std::find(cur_elem.id_vertices.begin(), cur_elem.id_vertices.end(), ID2) != cur_elem.id_vertices.end() + && std::find(cur_elem.id_vertices.begin(), cur_elem.id_vertices.end(), ID3) != cur_elem.id_vertices.end(); }); if (cur_iter != last_iter) { @@ -66,9 +63,9 @@ std::vector MeshLoader::findEdge(size_t ID1, size_t ID2) { auto last_iter = finiteElements.end(); while (cur_iter != last_iter) { - cur_iter = std::find_if(cur_iter, last_iter, [ID1, ID2](FiniteElement& cur_elem) {//!!!cur_elem изменяется? Где const? - return std::find(cur_elem.materials.begin(), cur_elem.materials.end(), ID1) != cur_elem.materials.end() - && std::find(cur_elem.materials.begin(), cur_elem.materials.end(), ID2) != cur_elem.materials.end(); + cur_iter = std::find_if(cur_iter, last_iter, [ID1, ID2](const FiniteElement& cur_elem) {//!!!ИСПРАВЛЕНО cur_elem изменяется? Где const? + return std::find(cur_elem.id_vertices.begin(), cur_elem.id_vertices.end(), ID1) != cur_elem.id_vertices.end() + && std::find(cur_elem.id_vertices.begin(), cur_elem.id_vertices.end(), ID2) != cur_elem.id_vertices.end(); }); if (cur_iter != last_iter) { @@ -81,9 +78,9 @@ std::vector MeshLoader::findEdge(size_t ID1, size_t ID2) { } -std::vector MeshLoader::vertex_nodes_by_surface_ID(size_t s_id) { +std::vector MeshLoader::vertex_nodes_by_surface_ID(size_t s_id) { - std::vector answer; + std::set answer; auto current_iter = boundaryFiniteElements.begin(); while (current_iter != boundaryFiniteElements.end()) { current_iter = std::find_if(current_iter, boundaryFiniteElements.end(), [s_id](const BoundaryFiniteElement& s) { return s.ID_surface == s_id; }); @@ -91,14 +88,14 @@ std::vector MeshLoader::vertex_nodes_by_surface_ID(size_t s_id) { { for (const auto& elem : current_iter->node_boundary) { - answer.insert(Get_Node_by_ID(s_id)); //!!! (Не исправлено) Где гарантия, что не будет дубликатов? Разные КЭ могут содержать одни и те же узлы. - //!!! ПРЕЖДЕ ЧЕМ ОТПРАВЛЯТЬ НА ПРОВЕРКУ КОМПИЛИРУЙТЕ ПРОГРАММУ! - //!!! У вектора нет insert с одним параметром. + answer.insert(Get_Node_by_ID(s_id)); //!!! ИСПРАВЛЕНО (Не исправлено) Где гарантия, что не будет дубликатов? Разные КЭ могут содержать одни и те же узлы. + //!!! ИСПРАВЛЕНО ПРЕЖДЕ ЧЕМ ОТПРАВЛЯТЬ НА ПРОВЕРКУ КОМПИЛИРУЙТЕ ПРОГРАММУ! + //!!! ИСПРАВЛЕНО У вектора нет insert с одним параметром. } ++current_iter; } } - return answer; + return std::vector(answer.begin(), answer.end()); } @@ -147,8 +144,8 @@ std::vector MeshLoader::getBoundaryFiniteID(size_t ID) { return std::vector(result.begin(), result.end()); } -Node MeshLoader::Get_Node_by_ID(size_t n_id){ //!!! Лишнее копирование при возврате - return nodes.at(n_id); +Node& MeshLoader::Get_Node_by_ID(size_t n_id){ //!!! ИСПРАВЛЕНО Лишнее копирование при возврате + return nodes[n_id]; } void MeshLoader::InsertNewNodes(){ @@ -164,16 +161,18 @@ void MeshLoader::InsertNewNodes(){ auto search_edge = edge_container.find(current_edge); if (search_edge == edge_container.end()) { - Node left_node = Get_Node_by_ID(*i); //!!! Копрование узла на каждой итерации. - Node right_node = Get_Node_by_ID(*j); //!!! Копрование узла на каждой итерации. - - //!!! Форматируйте код. Он не должнен быть шире 100 символов - std::vector x = { (left_node.coord[0] + right_node.coord[0]) / 2, (left_node.coord[0] + right_node.coord[0]) / 2, (left_node.coord[0] + right_node.coord[0]) / 2 }; - Node center_node(nodes.size() + 1, x, false); //!!! Копирование x в узел. Либо используйте move (с нужной версией конструктора), + Node left_node = Get_Node_by_ID(elem.node_boundary[*i]); //!!! ИСПРАВЛЕНО Копрование узла на каждой итерации. + Node right_node = Get_Node_by_ID(elem.node_boundary[*j]); //!!!ИСПРАВЛЕНО Копрование узла на каждой итерации. + + //!!! ИСПРАВЛЕНО Форматируйте код. Он не должнен быть шире 100 символов + std::vector x = { (left_node.coord[0] + right_node.coord[0]) / 2, + (left_node.coord[0] + right_node.coord[0]) / 2, + (left_node.coord[0] + right_node.coord[0]) / 2 }; + Node center_node(nodes.size() + 1, x, false); //!!! ИСПРАВЛЕНО Копирование x в узел. Либо используйте move (с нужной версией конструктора), //!!! либо создавайте узел и редактируйте его поле, а не заренее вектор создавайте. current_edge.self_id = nodes.size() + 1; edge_container.insert(current_edge); - nodes.push_back(center_node); + nodes.push_back(std::move(center_node)); elem.node_boundary.emplace_back(current_edge.self_id); } else{ @@ -204,39 +203,29 @@ void MeshLoader::InsertNewNodes(){ } -bool MeshLoader::ratio(const FiniteElement& elem) { - if (elem.materials.size() < 4) return false; - Node A = get_node(elem.materials[0]); - Node B = get_node(elem.materials[1]); - Node C = get_node(elem.materials[2]); - Node D = get_node(elem.materials[3]); - 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; -} - void MeshLoader::sort_range(const std::string& filepath) { std::vector elements = GetFE(); if (elements.empty()) return; - - // !!! Где сортировка по данному притерию? + // !!! ИСПРАВЛЕНО Где сортировка по данному притерию? + std::ranges::sort(elements.begin(), elements.end(), [&](const auto& elem1, const auto& elem2) { + if (elem1.id_vertices.size() < 4) return false; + Node A = get_node(elem1.id_vertices[0]); + Node B = get_node(elem1.id_vertices[1]); + Node C = get_node(elem2.id_vertices[0]); + Node D = get_node(elem2.id_vertices[1]); + 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; + }); std::ofstream file(filepath + ".txt"); - - - std::ranges::copy(elements | std::ranges::views::filter([&](const FiniteElement& ABCD) { //!!! По заданию нужно взять первые 10, а не фильтровать. - return ratio(ABCD); - } - ) | std::ranges::views::transform( - [](const FiniteElement& ABCD) { - return ABCD.materials; //!!! Выводит по заданию нужно список ID вершин. Если это он, то при чем тут материалы? - }), std::ostream_iterator>(file)); //!!! Где перегрузка << для std::vector? - + std::ranges::for_each(elements | std::ranges::views::take(6), [&](const auto& element){//!!! ИСПРАВЛЕНО По заданию нужно взять первые 10, а не фильтровать. + std::ranges::copy(element.id_vertices.begin(), element.id_vertices.end(), std::ostream_iterator(std::cout, "\n")); });//!!!ИСПРАВЛЕНО Выводит по заданию нужно список ID вершин. Если это он, то при чем тут материалы? } diff --git a/MeshLoader.h b/MeshLoader.h index 104d826a5a543a4b14ab94f35af9a0437236ed39..853e93fd9c7f6c774d962bd1788d841c6894da50 100644 --- a/MeshLoader.h +++ b/MeshLoader.h @@ -17,15 +17,15 @@ public: 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 vertex_nodes_by_surface_ID(size_t id); std::vector> GetNodesNeighbors(); std::vector getMaterialID(size_t id); std::vector getBoundaryFiniteID(size_t id); - Node Get_Node_by_ID(size_t n_id); + Node& Get_Node_by_ID(size_t n_id); void InsertNewNodes(); - bool ratio(const FiniteElement& elem); + void sort_range(const std::string& filepath); diff --git a/Struct.cpp b/Struct.cpp index a521f8078f6e45cc47b53f4edf28a48d64a08a09..59ec8d07db5d455720ee3377da04a5fb97c56223 100644 --- a/Struct.cpp +++ b/Struct.cpp @@ -9,7 +9,7 @@ std::ostream& operator<<(std::ostream& out, const Node& element) { std::ostream& operator<<(std::ostream& out, const FiniteElement& element) { out << element.ID << " | " << element.ID_material << " | "; - for (auto& e : element.materials) + for (auto& e : element.id_vertices) out << e << " "; out << " | " << std::endl; return out; diff --git a/Struct.h b/Struct.h index 3dbe2722e6066e93349c0cfb4aee79de87943daf..4cb69574c7ed73fb9d35ed896a1dc31a4fff8555 100644 --- a/Struct.h +++ b/Struct.h @@ -15,9 +15,9 @@ struct Node { struct FiniteElement { size_t ID; size_t ID_material; - std::vector materials; + std::vector id_vertices; FiniteElement(size_t _ID, size_t _ID_material, std::vector_materials) : ID(_ID), - ID_material(_ID_material), materials(std::move(_materials)) {}; + ID_material(_ID_material), id_vertices(std::move(_materials)) {}; friend std::ostream& operator<<(std::ostream& out, const FiniteElement& el);