#mesh #cgal #simplification
#меш #cgal #упрощение
Вопрос:
Я пытаюсь использовать упрощение сетки с триангулированной поверхностью cgal. Я использовал упрощение Гарланда и Хекберта, чтобы упростить свою сетку, но это занимает так много времени. Мои данные имеют 50000 nv, 165883 ne и 109521 nf, для чего требуется почти 30 минут с 0,2 stop_ratio. Разумна ли стоимость выполнения? Я также проверяю, допустима ли входная сетка, используя CGAL::is_valid_polygon_mesh. Это действительно так. как я могу решить эту проблему? Огромное спасибо…
стоимость выполнения сетки с 165883 ребрами
стоимость выполнения сетки с 8282 ребрами
enter code here
#include lt;fstreamgt; #include lt;iostreamgt; #include lt;iteratorgt; #include lt;vectorgt; #include "gltf-loader.h" #define TINYGLTF_NO_STB_IMAGE_WRITE #define TINYGLTF_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_WRITE_IMPLEMENTATION #include "tiny_gltf.h" #include lt;CGAL/Exact_predicates_inexact_constructions_kernel.hgt; #include lt;CGAL/Simple_cartesian.hgt; #include lt;CGAL/Surface_mesh.hgt; #include lt;CGAL/draw_surface_mesh.hgt; #include lt;CGAL/draw_polygon_2.hgt; #include lt;CGAL/Polygon_mesh_processing/repair.hgt; #include lt;CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.hgt; #include lt;CGAL/boost/graph/iterator.hgt; #include lt;CGAL/Polygon_2.hgt; #include lt;CGAL/Surface_mesh_simplification/edge_collapse.hgt; #include lt;CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.hgt; #include lt;CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.hgt; #include lt;CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_policies.hgt; #include lt;CGAL/Polyhedron_3.hgt; #include lt;CGAL/Polygon_mesh_processing/stitch_borders.hgt; #include lt;chronogt; #include lt;vectorgt; using namespace example; namespace PMP = CGAL::Polygon_mesh_processing; namespace NP = CGAL::parameters; //typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Simple_cartesianlt;doublegt; K; typedef CGAL::Surface_meshlt;K::Point_3gt; CGAL_Mesh; typedef CGAL_Mesh::Vertex_index vertex_descriptor; typedef CGAL_Mesh::Face_index face_descriptor; namespace SMS = CGAL::Surface_mesh_simplification; CGAL_Mesh inital_mesh; const char* filename = "C:\Users\Administrator\source\repos\CMakeProject4\CMakeProject4\input.off"; if (!PMP::IO::read_polygon_mesh(filename, inital_mesh) || CGAL::is_empty(inital_mesh)) { std::cerr lt;lt; "Invalid input." lt;lt; std::endl; return 1; } std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); double stop_ratio = 0.2; std::cout lt;lt; "start edge collages." lt;lt; std::endl; SMS::Count_ratio_stop_predicatelt;CGAL_Meshgt; stop(stop_ratio); typedef typename SMS::GarlandHeckbert_policieslt;CGAL_Mesh, Kgt; GH_policies; typedef typename GH_policies::Get_cost GH_cost; typedef typename GH_policies::Get_placement GH_placement; typedef SMS::Bounded_normal_change_placementlt;GH_placementgt; Bounded_GH_placement; bool check_mesh = CGAL::is_valid_polygon_mesh(inital_mesh); std::cout lt;lt; "vaild or in valid" lt;lt;check_meshlt;lt; std::endl; GH_policies gh_policies(inital_mesh); const GH_costamp; gh_cost = gh_policies.get_cost(); const GH_placementamp; gh_placement = gh_policies.get_placement(); Bounded_GH_placement placement(gh_placement); std::cout lt;lt; "Input mesh has " lt;lt; num_vertices(inital_mesh) lt;lt; " nv "lt;lt; num_edges(inital_mesh) lt;lt; " ne " lt;lt; num_faces(inital_mesh) lt;lt; " nf" lt;lt; std::endl; /*internal::cgal_enable_sms_trace = true;*/ int r = SMS::edge_collapse(inital_mesh, stop, CGAL::parameters::get_cost(gh_cost) .get_placement(placement));
Комментарии:
1. Не могли бы вы привести минимальный пример, показывающий вашу проблему? Ожидаемое время выполнения должно составлять несколько секунд. Заканчивается ли это?
2. @sloriot , я обновляю свой код и стоимость выполнения двух mesh. Проект может соблазнить. Я знаю,что время выполнения должно составлять несколько секунд, но я не знаю, почему мой проект занимает так много времени.
3. Вы компилировали в режиме выпуска без утверждений, верно? Можете ли вы поделиться информацией, которая занимает много времени, чтобы я мог попытаться воспроизвести проблему?
4. Большое вам спасибо!! Ты напоминаешь мне. Я использовал режим отладки. Проблема решена. @sloriot