mirror of https://github.com/CGAL/cgal
remove seed update in proxy fitting
This commit is contained in:
parent
afc8fadd33
commit
0f604cd58d
|
|
@ -42,8 +42,7 @@ struct PointProxyFitting {
|
||||||
PointProxyFitting(const FacetCenterMap &_center_pmap,
|
PointProxyFitting(const FacetCenterMap &_center_pmap,
|
||||||
const FacetAreaMap &_area_pmap)
|
const FacetAreaMap &_area_pmap)
|
||||||
: center_pmap(_center_pmap),
|
: center_pmap(_center_pmap),
|
||||||
area_pmap(_area_pmap),
|
area_pmap(_area_pmap) {}
|
||||||
error_functor(center_pmap) {}
|
|
||||||
|
|
||||||
template<typename FacetIterator>
|
template<typename FacetIterator>
|
||||||
PointProxy operator()(const FacetIterator beg, const FacetIterator end) {
|
PointProxy operator()(const FacetIterator beg, const FacetIterator end) {
|
||||||
|
|
@ -62,23 +61,11 @@ struct PointProxyFitting {
|
||||||
PointProxy px;
|
PointProxy px;
|
||||||
px.center = CGAL::ORIGIN + center;
|
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;
|
return px;
|
||||||
}
|
}
|
||||||
|
|
||||||
const FacetCenterMap center_pmap;
|
const FacetCenterMap center_pmap;
|
||||||
const FacetAreaMap area_pmap;
|
const FacetAreaMap area_pmap;
|
||||||
CompactMetric error_functor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ApproxTrait {
|
struct ApproxTrait {
|
||||||
|
|
|
||||||
|
|
@ -148,7 +148,9 @@ private:
|
||||||
if ((index++) % interval == 0) {
|
if ((index++) % interval == 0) {
|
||||||
// Use proxy_fitting functor to create a proxy
|
// Use proxy_fitting functor to create a proxy
|
||||||
std::vector<face_descriptor> fvec(1, f);
|
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)
|
if (proxies.size() >= initial_px)
|
||||||
break;
|
break;
|
||||||
|
|
@ -171,10 +173,14 @@ private:
|
||||||
// generate 2 seeds
|
// generate 2 seeds
|
||||||
typename boost::graph_traits<TriangleMesh>::face_iterator
|
typename boost::graph_traits<TriangleMesh>::face_iterator
|
||||||
f0 = faces(mesh).first, f1 = ++f0;
|
f0 = faces(mesh).first, f1 = ++f0;
|
||||||
std::vector<face_descriptor> fvec(1, *f0);
|
std::vector<face_descriptor> fvec0(1, *f0);
|
||||||
proxies.push_back(proxy_fitting(fvec.begin(), fvec.end()));
|
Proxy px0 = proxy_fitting(fvec0.begin(), fvec0.end());
|
||||||
std::vector<face_descriptor> fvec2(1, *f1);
|
px0.seed = *f0;
|
||||||
proxies.push_back(proxy_fitting(fvec2.begin(), fvec2.end()));
|
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;
|
const std::size_t num_steps = 5;
|
||||||
while (proxies.size() < initial_px) {
|
while (proxies.size() < initial_px) {
|
||||||
|
|
@ -256,8 +262,23 @@ private:
|
||||||
BOOST_FOREACH(face_descriptor f, faces(mesh))
|
BOOST_FOREACH(face_descriptor f, faces(mesh))
|
||||||
px_facets[seg_pmap[f]].push_back(f);
|
px_facets[seg_pmap[f]].push_back(f);
|
||||||
|
|
||||||
|
// fit proxy parameter
|
||||||
for (std::size_t i = 0; i < proxies.size(); ++i)
|
for (std::size_t i = 0; i < proxies.size(); ++i)
|
||||||
proxies[i] = proxy_fitting(px_facets[i].begin(), px_facets[i].end());
|
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
|
// create new proxy
|
||||||
std::vector<face_descriptor> fvec(1, max_facet[max_px_idx]);
|
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) {
|
if (num_to_add[px_id] > 0) {
|
||||||
std::vector<face_descriptor> fvec(1, f);
|
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_to_add[px_id];
|
||||||
++num_inserted;
|
++num_inserted;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,9 +65,7 @@ template<typename PlaneProxy,
|
||||||
struct L21ProxyFitting
|
struct L21ProxyFitting
|
||||||
{
|
{
|
||||||
L21ProxyFitting(const FacetNormalMap &normal_pmap, const FacetAreaMap &area_pmap)
|
L21ProxyFitting(const FacetNormalMap &normal_pmap, const FacetAreaMap &area_pmap)
|
||||||
: normal_pmap(normal_pmap),
|
: normal_pmap(normal_pmap), area_pmap(area_pmap) {
|
||||||
area_pmap(area_pmap),
|
|
||||||
error_functor(normal_pmap, area_pmap) {
|
|
||||||
GeomTraits traits;
|
GeomTraits traits;
|
||||||
sum_functor = traits.construct_sum_of_vectors_3_object();
|
sum_functor = traits.construct_sum_of_vectors_3_object();
|
||||||
scale_functor = traits.construct_scaled_vector_3_object();
|
scale_functor = traits.construct_scaled_vector_3_object();
|
||||||
|
|
@ -99,17 +97,6 @@ template<typename PlaneProxy,
|
||||||
PlaneProxy px;
|
PlaneProxy px;
|
||||||
px.normal = norm;
|
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;
|
return px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -117,7 +104,6 @@ template<typename PlaneProxy,
|
||||||
const FacetAreaMap area_pmap;
|
const FacetAreaMap area_pmap;
|
||||||
Construct_scaled_vector_3 scale_functor;
|
Construct_scaled_vector_3 scale_functor;
|
||||||
Construct_sum_of_vectors_3 sum_functor;
|
Construct_sum_of_vectors_3 sum_functor;
|
||||||
L21Metric error_functor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename TriangleMesh,
|
template<typename TriangleMesh,
|
||||||
|
|
@ -281,12 +267,8 @@ template<typename PlaneProxy,
|
||||||
typedef typename GeomTraits::Construct_scaled_vector_3 Construct_scaled_vector_3;
|
typedef typename GeomTraits::Construct_scaled_vector_3 Construct_scaled_vector_3;
|
||||||
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
|
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
|
||||||
|
|
||||||
L2ProxyFitting(const TriangleMesh &_mesh,
|
L2ProxyFitting(const TriangleMesh &_mesh, const VertexPointMap &_point_pmap)
|
||||||
const VertexPointMap &_point_pmap,
|
: mesh(_mesh), point_pmap(_point_pmap) {}
|
||||||
const FacetAreaMap &_area_pmap)
|
|
||||||
: mesh(_mesh),
|
|
||||||
point_pmap(_point_pmap),
|
|
||||||
error_functor(_mesh, _area_pmap, _point_pmap) {}
|
|
||||||
|
|
||||||
template<typename FacetIterator>
|
template<typename FacetIterator>
|
||||||
PlaneProxy operator()(const FacetIterator beg, const FacetIterator end) {
|
PlaneProxy operator()(const FacetIterator beg, const FacetIterator end) {
|
||||||
|
|
@ -309,23 +291,11 @@ template<typename PlaneProxy,
|
||||||
px.fit_plane,
|
px.fit_plane,
|
||||||
CGAL::Dimension_tag<2>());
|
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;
|
return px;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TriangleMesh &mesh;
|
const TriangleMesh &mesh;
|
||||||
const VertexPointMap point_pmap;
|
const VertexPointMap point_pmap;
|
||||||
ErrorMetric error_functor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename TriangleMesh,
|
template<typename TriangleMesh,
|
||||||
|
|
@ -406,7 +376,7 @@ public:
|
||||||
|
|
||||||
// construct proxy fitting functor
|
// construct proxy fitting functor
|
||||||
ProxyFitting construct_proxy_fitting_functor() const {
|
ProxyFitting construct_proxy_fitting_functor() const {
|
||||||
return ProxyFitting(mesh, point_pmap, area_pmap);
|
return ProxyFitting(mesh, point_pmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue