diff --git a/MeshLoader.cpp b/MeshLoader.cpp index 86bd93803ee0c3f8e8c38c7b4e51a234c0887562..1e1e467edd271dec36f2b368e23728629af8dc69 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)); }