remove seed update in proxy fitting

This commit is contained in:
Lingjie Zhu 2017-07-25 18:50:43 +08:00
parent afc8fadd33
commit 0f604cd58d
3 changed files with 37 additions and 55 deletions

View File

@ -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<typename FacetIterator>
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 {

View File

@ -148,7 +148,9 @@ private:
if ((index++) % interval == 0) {
// Use proxy_fitting functor to create a proxy
std::vector<face_descriptor> 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<TriangleMesh>::face_iterator
f0 = faces(mesh).first, f1 = ++f0;
std::vector<face_descriptor> fvec(1, *f0);
proxies.push_back(proxy_fitting(fvec.begin(), fvec.end()));
std::vector<face_descriptor> fvec2(1, *f1);
proxies.push_back(proxy_fitting(fvec2.begin(), fvec2.end()));
std::vector<face_descriptor> fvec0(1, *f0);
Proxy px0 = proxy_fitting(fvec0.begin(), fvec0.end());
px0.seed = *f0;
proxies.push_back(px0);
std::vector<face_descriptor> 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<face_descriptor> 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<face_descriptor> 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;
}

View File

@ -65,9 +65,7 @@ template<typename PlaneProxy,
struct L21ProxyFitting
{
L21ProxyFitting(const FacetNormalMap &normal_pmap, const FacetAreaMap &area_pmap)
: normal_pmap(normal_pmap),
area_pmap(area_pmap),
error_functor(normal_pmap, area_pmap) {
: normal_pmap(normal_pmap), area_pmap(area_pmap) {
GeomTraits traits;
sum_functor = traits.construct_sum_of_vectors_3_object();
scale_functor = traits.construct_scaled_vector_3_object();
@ -99,17 +97,6 @@ template<typename PlaneProxy,
PlaneProxy px;
px.normal = norm;
// 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;
}
@ -117,7 +104,6 @@ template<typename PlaneProxy,
const FacetAreaMap area_pmap;
Construct_scaled_vector_3 scale_functor;
Construct_sum_of_vectors_3 sum_functor;
L21Metric error_functor;
};
template<typename TriangleMesh,
@ -281,12 +267,8 @@ template<typename PlaneProxy,
typedef typename GeomTraits::Construct_scaled_vector_3 Construct_scaled_vector_3;
typedef typename boost::graph_traits<TriangleMesh>::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<typename FacetIterator>
PlaneProxy operator()(const FacetIterator beg, const FacetIterator end) {
@ -309,23 +291,11 @@ template<typename PlaneProxy,
px.fit_plane,
CGAL::Dimension_tag<2>());
// 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<typename TriangleMesh,
@ -406,7 +376,7 @@ public:
// construct proxy fitting functor
ProxyFitting construct_proxy_fitting_functor() const {
return ProxyFitting(mesh, point_pmap, area_pmap);
return ProxyFitting(mesh, point_pmap);
}
private: