From c8dfada5b93a591797b8b4c198d5e2bdb249ee88 Mon Sep 17 00:00:00 2001 From: Oleg Avilov Date: Sat, 5 Feb 2022 16:01:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D1=89=D0=B8?= =?UTF-8?q?=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MeshLoader.cpp | 104 ++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/MeshLoader.cpp b/MeshLoader.cpp index 86bd938..1e1e467 100644 --- a/MeshLoader.cpp +++ b/MeshLoader.cpp @@ -216,69 +216,67 @@ void MeshLoader::printSmallAngles(const std::string& filepath) std::ofstream file(filepath); - int counter = 1; //!!! Нарушено условие за один pipeline. Есть std::ranges::take + //!!! Нарушено условие за один pipeline. Есть std::ranges::take ~~~исправил - std::ranges::copy_if(FiniteElements | + std::ranges::copy(FiniteElements | std::ranges::views::transform([](const FiniteElement& elem) { - return elem.nodesId; }), - std::ostream_iterator>(file), - [&](const std::vector& elem) - { - if (counter > 10) - { - return false; - } - std::vector> planesNodes{ {0, 1, 2}, {0, 2, 3}, {0, 1, 3}, {1, 2, 3} }; - std::vector> planesCords; - for (auto& plane : planesNodes) + return elem.nodesId; }) | std::ranges::views::filter([&](const std::vector& elem) { - auto& node1Cords = findNodeRanges(elem[plane[0]]); - auto& node2Cords = findNodeRanges(elem[plane[1]]); - auto& node3Cords = findNodeRanges(elem[plane[2]]); - - // Найдем уравнение плоскости по трем точкам - double A = node1Cords[1] * (node2Cords[2] - node3Cords[2]) + - node2Cords[1] * (node3Cords[2] - node1Cords[2]) + - node3Cords[1] * (node1Cords[2] - node2Cords[2]); - - double B = node1Cords[2] * (node2Cords[0] - node3Cords[0]) + - node2Cords[2] * (node3Cords[0] - node1Cords[0]) + - node3Cords[2] * (node1Cords[0] - node2Cords[0]); - - double C = node1Cords[0] * (node2Cords[1] - node3Cords[1]) + - node2Cords[0] * (node3Cords[1] - node1Cords[1]) + - node3Cords[0] * (node1Cords[1] - node2Cords[1]); + if (counter > 10) + { + return false; + } + std::vector> planesNodes{ {0, 1, 2}, {0, 2, 3}, {0, 1, 3}, {1, 2, 3} }; + std::vector> planesCords; + for (auto& plane : planesNodes) + { + auto& node1Cords = findNodeRanges(elem[plane[0]]); + auto& node2Cords = findNodeRanges(elem[plane[1]]); + auto& node3Cords = findNodeRanges(elem[plane[2]]); - planesCords.push_back({ A,B,C }); - } + // Найдем уравнение плоскости по трем точкам + double A = node1Cords[1] * (node2Cords[2] - node3Cords[2]) + + node2Cords[1] * (node3Cords[2] - node1Cords[2]) + + node3Cords[1] * (node1Cords[2] - node2Cords[2]); - // Пройдемся по всем парам плоскостей и вычислим двугранные углы - for (int i = 0; i < 4; i++) - for (int j = i + 1; j < 4; j++) - { - auto& plane1 = planesCords[i]; - auto& plane2 = planesCords[j]; + double B = node1Cords[2] * (node2Cords[0] - node3Cords[0]) + + node2Cords[2] * (node3Cords[0] - node1Cords[0]) + + node3Cords[2] * (node1Cords[0] - node2Cords[0]); - double numerator = abs(plane1[0] * plane2[0] + - plane1[1] * plane2[1] + - plane1[2] * plane2[2]); - double denominator = sqrt(plane1[0] * plane1[0] + - plane1[1] * plane1[1] + - plane1[2] * plane1[2]) * - sqrt(plane2[0] * plane2[0] + - plane2[1] * plane2[1] + - plane2[2] * plane2[2]); + double C = node1Cords[0] * (node2Cords[1] - node3Cords[1]) + + node2Cords[0] * (node3Cords[1] - node1Cords[1]) + + node3Cords[0] * (node1Cords[1] - node2Cords[1]); + planesCords.push_back({ A,B,C }); + } - if (acos(numerator / denominator) * 180 / PI < 10) + // Пройдемся по всем парам плоскостей и вычислим двугранные углы + for (int i = 0; i < 4; i++) + for (int j = i + 1; j < 4; j++) { - counter++; - - return true; + auto& plane1 = planesCords[i]; + auto& plane2 = planesCords[j]; + + double numerator = abs(plane1[0] * plane2[0] + + plane1[1] * plane2[1] + + plane1[2] * plane2[2]); + double denominator = sqrt(plane1[0] * plane1[0] + + plane1[1] * plane1[1] + + plane1[2] * plane1[2]) * + sqrt(plane2[0] * plane2[0] + + plane2[1] * plane2[1] + + plane2[2] * plane2[2]); + + + if (acos(numerator / denominator) * 180 / PI < 10) + { + return true; + } } - } - return false; - }); + return false; + }) | + std::ranges::views::take(10), + std::ostream_iterator>(file)); } -- GitLab