diff --git a/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_metric_example.cpp b/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_metric_example.cpp index b63ea6d6fec..0e73e595a7a 100644 --- a/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_metric_example.cpp +++ b/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_metric_example.cpp @@ -42,8 +42,7 @@ struct PointProxyFitting { PointProxyFitting(const FacetCenterMap &_center_pmap, const FacetAreaMap &_area_pmap) : center_pmap(_center_pmap), - area_pmap(_area_pmap), - error_functor(center_pmap) {} + area_pmap(_area_pmap) {} template PointProxy operator()(const FacetIterator beg, const FacetIterator end) { @@ -62,23 +61,11 @@ struct PointProxyFitting { PointProxy px; px.center = CGAL::ORIGIN + center; - // update seed - px.seed = *beg; - FT err_min = error_functor(*beg, px); - for (FacetIterator fitr = beg; fitr != end; ++fitr) { - FT err = error_functor(*fitr, px); - if (err < err_min) { - err_min = err; - px.seed = *fitr; - } - } - return px; } const FacetCenterMap center_pmap; const FacetAreaMap area_pmap; - CompactMetric error_functor; }; struct ApproxTrait { diff --git a/Surface_mesh_approximation/include/CGAL/internal/Surface_mesh_approximation/VSA.h b/Surface_mesh_approximation/include/CGAL/internal/Surface_mesh_approximation/VSA.h index 3cf89814134..47618ad0000 100644 --- a/Surface_mesh_approximation/include/CGAL/internal/Surface_mesh_approximation/VSA.h +++ b/Surface_mesh_approximation/include/CGAL/internal/Surface_mesh_approximation/VSA.h @@ -148,7 +148,9 @@ private: if ((index++) % interval == 0) { // Use proxy_fitting functor to create a proxy std::vector fvec(1, f); - proxies.push_back(proxy_fitting(fvec.begin(), fvec.end())); + Proxy px = proxy_fitting(fvec.begin(), fvec.end()); + px.seed = f; + proxies.push_back(px); } if (proxies.size() >= initial_px) break; @@ -171,10 +173,14 @@ private: // generate 2 seeds typename boost::graph_traits::face_iterator f0 = faces(mesh).first, f1 = ++f0; - std::vector fvec(1, *f0); - proxies.push_back(proxy_fitting(fvec.begin(), fvec.end())); - std::vector fvec2(1, *f1); - proxies.push_back(proxy_fitting(fvec2.begin(), fvec2.end())); + std::vector fvec0(1, *f0); + Proxy px0 = proxy_fitting(fvec0.begin(), fvec0.end()); + px0.seed = *f0; + proxies.push_back(px0); + std::vector fvec1(1, *f1); + Proxy px1 = proxy_fitting(fvec1.begin(), fvec1.end()); + px1.seed = *f1; + proxies.push_back(px1); const std::size_t num_steps = 5; while (proxies.size() < initial_px) { @@ -256,8 +262,23 @@ private: BOOST_FOREACH(face_descriptor f, faces(mesh)) px_facets[seg_pmap[f]].push_back(f); + // fit proxy parameter for (std::size_t i = 0; i < proxies.size(); ++i) proxies[i] = proxy_fitting(px_facets[i].begin(), px_facets[i].end()); + + // update proxy seed + for (std::size_t i = 0; i < proxies.size(); ++i) { + Proxy &px = proxies[i]; + px.seed = px_facets[i].front(); + FT err_min = fit_error(px_facets[i].front(), px); + BOOST_FOREACH(face_descriptor f, px_facets[i]) { + FT err = fit_error(f, px); + if (err < err_min) { + err_min = err; + px.seed = f; + } + } + } } /** @@ -291,7 +312,9 @@ private: // create new proxy std::vector fvec(1, max_facet[max_px_idx]); - proxies.push_back(proxy_fitting(fvec.begin(), fvec.end())); + Proxy px = proxy_fitting(fvec.begin(), fvec.end()); + px.seed = max_facet[max_px_idx]; + proxies.push_back(px); } /** @@ -353,7 +376,9 @@ private: if (num_to_add[px_id] > 0) { std::vector fvec(1, f); - proxies.push_back(proxy_fitting(fvec.begin(), fvec.end())); + Proxy px = proxy_fitting(fvec.begin(), fvec.end()); + px.seed = f; + proxies.push_back(px); --num_to_add[px_id]; ++num_inserted; } diff --git a/Surface_mesh_approximation/include/CGAL/vsa_mesh_approximation_traits.h b/Surface_mesh_approximation/include/CGAL/vsa_mesh_approximation_traits.h index 6bf8cafa390..0585f9aca81 100644 --- a/Surface_mesh_approximation/include/CGAL/vsa_mesh_approximation_traits.h +++ b/Surface_mesh_approximation/include/CGAL/vsa_mesh_approximation_traits.h @@ -65,9 +65,7 @@ template::halfedge_descriptor halfedge_descriptor; - L2ProxyFitting(const TriangleMesh &_mesh, - const VertexPointMap &_point_pmap, - const FacetAreaMap &_area_pmap) - : mesh(_mesh), - point_pmap(_point_pmap), - error_functor(_mesh, _area_pmap, _point_pmap) {} + L2ProxyFitting(const TriangleMesh &_mesh, const VertexPointMap &_point_pmap) + : mesh(_mesh), point_pmap(_point_pmap) {} template PlaneProxy operator()(const FacetIterator beg, const FacetIterator end) { @@ -309,23 +291,11 @@ template()); - // update seed - px.seed = *beg; - FT err_min = error_functor(*beg, px); - for (FacetIterator fitr = beg; fitr != end; ++fitr) { - FT err = error_functor(*fitr, px); - if (err < err_min) { - err_min = err; - px.seed = *fitr; - } - } - return px; } const TriangleMesh &mesh; const VertexPointMap point_pmap; - ErrorMetric error_functor; }; template