diff --git a/MeshLoader.cpp b/MeshLoader.cpp index 4c1b9294d8fd76aaa7424345eeaa444eca711745..8f808c64f52a32c7bf1f5170f8680fa5a258d980 100644 --- a/MeshLoader.cpp +++ b/MeshLoader.cpp @@ -1,18 +1,25 @@ #include "MeshLoader.h" +//!!! Зачем копировать при возврате? std::vector MeshLoader::getNodes() { return nodes; } +//!!! Зачем копировать при возврате? std::vector MeshLoader::getFEs() { return allFEs; } +//!!! Зачем копировать при возврате? std::vector MeshLoader::getBFEs() { return allBFEs; } + +//!!! Возвращать везде нужно не элементы/узлы сами, а их ID + + std::vector MeshLoader::getFEbyId(int n1, int n2, int n3) { std::vector res; std::for_each(allFEs.begin(), allFEs.end(), [&n1, &n2, &n3, &res](FiniteElement fe) { @@ -27,7 +34,7 @@ std::vector MeshLoader::getFEbyId(int n1, int n2, int n3) { std::vector MeshLoader::getFEbyEdge(int n1, int n2) { std::vector res; - std::for_each(allFEs.begin(), allFEs.end(), [&n1, &n2, &res](FiniteElement fe) { + std::for_each(allFEs.begin(), allFEs.end(), [&n1, &n2, &res](FiniteElement fe) { //!!! Копирование fe if ((std::find(fe.idLst.begin(), fe.idLst.end(), n1) != fe.idLst.end()) && (std::find(fe.idLst.begin(), fe.idLst.end(), n2) != fe.idLst.end())) { res.push_back(fe); @@ -45,7 +52,7 @@ std::vector MeshLoader::getNodesByBoundaryId(int id) { }); if (cur != allBFEs.end()) { for (const auto &it: cur->idLst) { - auto nodeById = std::find_if(nodes.begin(), nodes.end(), [it](Node node) { + auto nodeById = std::find_if(nodes.begin(), nodes.end(), [it](Node node) { //!!! Копирование node return node.id == it; }); res.insert(*nodeById); @@ -89,6 +96,8 @@ void MeshLoader::printBFE(const BoundaryFiniteElement &bfe) { } void MeshLoader::insertNode(Node node, FiniteElement &fe, int nId1, int nId2) { + //!!! Не лучше ли узел тут создавать, а не передоавть? + node.id = nodes.size(); node.x1 = (nodes[nId1].x1 + nodes[nId2].x1) / 2; node.x2 = (nodes[nId1].x2 + nodes[nId2].x2) / 2; @@ -96,10 +105,13 @@ void MeshLoader::insertNode(Node node, FiniteElement &fe, int nId1, int nId2) { nodes.push_back(node); fe.idLst.push_back(node.id); - nodes.push_back(node); + + nodes.push_back(node); //!!! 2 раза зачем добавлять? } void MeshLoader::insertNode(Node node, BoundaryFiniteElement &fe, int nId1, int nId2) { + //!!! Не лучше ли узел тут создавать, а не передоавть? + node.id = nodes.size(); node.x1 = (nodes[nId1].x1 + nodes[nId2].x1) / 2; node.x2 = (nodes[nId1].x2 + nodes[nId2].x2) / 2; @@ -107,12 +119,14 @@ void MeshLoader::insertNode(Node node, BoundaryFiniteElement &fe, int nId1, int nodes.push_back(node); fe.idLst.push_back(node.id); - nodes.push_back(node); + + nodes.push_back(node); //!!! 2 раза зачем добавлять? } -std::vector> MeshLoader::createContainer() { +//!!! Что делает Node в результате? ID должен быть +std::vector> MeshLoader::createContainer() { //!!! Из названия не понятно, какой контейнер std::vector> ids(nodes.size() + 1); - for (auto &it: allFEs) { + for (auto &it: allFEs) { //!!! 1. Неверное имя it. Где вы видите итератор? 2. it изменяется в цикле? Где const? for (auto node1: it.idLst) { for (auto node2: it.idLst) { ids[node1].insert(node2); @@ -121,14 +135,23 @@ std::vector> MeshLoader::createContainer() { } } - std::vector> res(nodes.size() + 1); + std::vector> res(nodes.size() + 1); //!!! Не очень понятно, зачем эото цикл? for (int i = 1; i < nodes.size() + 1; ++i) { std::vector tmp; tmp.reserve(ids[i].size()); - for (auto &it_set: ids[i]) { + for (auto &it_set: ids[i]) { //!!! 1. Неверное имя it_set. Где вы видите итератор? 2. it_set изменяется в цикле? Где const? tmp.push_back(nodes[it_set]); } res[i] = std::move(tmp); } return res; -} \ No newline at end of file +} + + +//!!! Задание не выполнено до конца. В частности, где вставка узлов во все элементы? + + + + + +