diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index d36e1c67e36..1ee24fef37f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -409,9 +409,6 @@ template::type::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.01); - if (r < 0.000001) - return; - typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); @@ -446,7 +443,7 @@ template(x, r, c); - if (f_ratio > 0.000001) + if (f_ratio > 0.00000001) { corrected_mui += f_ratio * get(fmm, fi); for (face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) @@ -492,7 +489,7 @@ template 0.000001) + if (v_mu0 > 0.00000001) put(vcm, v, 0.5 * get(mu1_expand_map, v) / v_mu0); else put(vcm, v, 0); @@ -528,7 +525,7 @@ template 0.000001) + if(v_mu0 > 0.00000001) put(vcm, v, get(mu2_expand_map, v) / v_mu0); else put(vcm, v, 0); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 19afdc6728e..91deb90680a 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -487,8 +487,10 @@ public: connect(scene_obj, SIGNAL(itemIndexSelected(int)), this,SLOT(detectScalarProperties(int))); - on_propertyBox_currentIndexChanged(0); + connect(dock_widget->expandingRadiusSlider, SIGNAL(valueChanged(int)), + this, SLOT(setExpandingRadius(int))); + on_propertyBox_currentIndexChanged(0); } private: @@ -716,6 +718,10 @@ private Q_SLOTS: { Scene_surface_mesh_item* item = qobject_cast(sender()); + + maxEdgeLength = -1; + setExpandingRadius(dock_widget->expandingRadiusSlider->value()); + if(!item) return; SMesh& smesh = *item->face_graph(); @@ -784,43 +790,56 @@ private Q_SLOTS: treat_sm_property("f:jacobian", item->face_graph()); } - double sliderRangeToExpandRadius(SMesh& smesh, double val) + void setExpandingRadius(int val_int) { double sliderMin = dock_widget->expandingRadiusSlider->minimum(); double sliderMax = dock_widget->expandingRadiusSlider->maximum() - sliderMin; - val -= sliderMin; + double val = val_int - sliderMin; sliderMin = 0; + SMesh& smesh = *(qobject_cast(scene->item(scene->mainSelectionIndex())))->face_graph(); + auto vpm = get(CGAL::vertex_point, smesh); - auto edge_range = CGAL::edges(smesh); + if (maxEdgeLength < 0) + { + auto edge_range = CGAL::edges(smesh); - if (edge_range.begin() == edge_range.end()) - return 0; + if (edge_range.begin() == edge_range.end()) + { + expandRadius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); + return; + } - auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { - auto res = EPICK().compare_squared_distance_3_object()( - get(vpm, source((l), smesh)), - get(vpm, target((l), smesh)), - get(vpm, source((r), smesh)), - get(vpm, target((r), smesh))); - return res == CGAL::SMALLER; - }); + auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { + auto res = EPICK().compare_squared_distance_3_object()( + get(vpm, source((l), smesh)), + get(vpm, target((l), smesh)), + get(vpm, source((r), smesh)), + get(vpm, target((r), smesh))); + return res == CGAL::SMALLER; + }); - // if edge_reference is not derefrenceble - if (edge_reference == edge_range.end()) - return 0; + // if edge_reference is not derefrenceble + if (edge_reference == edge_range.end()) + { + expandRadius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); + return; + } - double L = sqrt( - (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) - .squared_length() - ); + maxEdgeLength = sqrt( + (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) + .squared_length() + ); - std::cout << L << std::endl; - - double outMin = 0, outMax = 5 * L, base = 1.2; - - return (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); + } + + double outMin = 0, outMax = 5 * maxEdgeLength, base = 1.2; + + expandRadius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); } @@ -830,9 +849,6 @@ private Q_SLOTS: "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); - expandRadius = sliderRangeToExpandRadius(smesh, dock_widget->expandingRadiusSlider->value()); - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); - //compute once and store the value per vertex bool non_init; SMesh::Property_map mu_i_map; @@ -1611,6 +1627,7 @@ private: std::unordered_map is_source; double expandRadius; + double maxEdgeLength = -1; double minBox; double maxBox; QPixmap legend_;