fit proxy from patch & seed facet

This commit is contained in:
Lingjie Zhu 2017-12-09 19:57:38 +08:00
parent 27d4485393
commit f951b81e62
1 changed files with 30 additions and 34 deletions

View File

@ -607,7 +607,7 @@ public:
continue; continue;
if (num_to_add[px_id] > 0) { if (num_to_add[px_id] > 0) {
m_proxies.push_back(fit_new_proxy(f, m_proxies.size())); m_proxies.push_back(fit_proxy_from_seed_facet(f, m_proxies.size()));
--num_to_add[px_id]; --num_to_add[px_id];
++num_added; ++num_added;
} }
@ -675,9 +675,9 @@ public:
merged_patch.push_back(f); merged_patch.push_back(f);
} }
} }
m_proxies[px_enlarged] = fit_new_proxy(merged_patch.begin(), merged_patch.end(), px_enlarged); m_proxies[px_enlarged] = fit_proxy_from_patch(merged_patch, px_enlarged);
// replace the merged proxy position to the newly teleported proxy // replace the merged proxy position to the newly teleported proxy
m_proxies[px_merged] = fit_new_proxy(tele_to, px_merged); m_proxies[px_merged] = fit_proxy_from_seed_facet(tele_to, px_merged);
put(m_fproxy_map, tele_to, px_merged); put(m_fproxy_map, tele_to, px_merged);
num_teleported++; num_teleported++;
@ -716,7 +716,7 @@ public:
merged_patch.push_back(f); merged_patch.push_back(f);
} }
} }
m_proxies[px0] = fit_new_proxy(merged_patch.begin(), merged_patch.end(), px0); m_proxies[px0] = fit_proxy_from_patch(merged_patch, px0);
// erase px1 and maintain proxy index // erase px1 and maintain proxy index
m_proxies.erase(m_proxies.begin() + px1); m_proxies.erase(m_proxies.begin() + px1);
@ -782,8 +782,7 @@ public:
std::list<face_descriptor> merged_patch(px_facets[pxi]); std::list<face_descriptor> merged_patch(px_facets[pxi]);
BOOST_FOREACH(face_descriptor f, px_facets[pxj]) BOOST_FOREACH(face_descriptor f, px_facets[pxj])
merged_patch.push_back(f); merged_patch.push_back(f);
Proxy_wrapper pxw_tmp = fit_new_proxy( Proxy_wrapper pxw_tmp = fit_proxy_from_patch(merged_patch, CGAL_VSA_INVALID_TAG);
merged_patch.begin(), merged_patch.end(), CGAL_VSA_INVALID_TAG);
FT error_merged(0.0); FT error_merged(0.0);
BOOST_FOREACH(face_descriptor f, merged_patch) BOOST_FOREACH(face_descriptor f, merged_patch)
@ -850,7 +849,7 @@ public:
if (get(m_fproxy_map, f) == px_idx && f != m_proxies[px_idx].seed) { if (get(m_fproxy_map, f) == px_idx && f != m_proxies[px_idx].seed) {
put(m_fproxy_map, f, m_proxies.size()); put(m_fproxy_map, f, m_proxies.size());
m_proxies.push_back(fit_new_proxy(f, m_proxies.size())); m_proxies.push_back(fit_proxy_from_seed_facet(f, m_proxies.size()));
++count; ++count;
// copy // copy
confined_proxies.push_back(m_proxies.back()); confined_proxies.push_back(m_proxies.back());
@ -1051,7 +1050,7 @@ private:
// reach to the number of proxies // reach to the number of proxies
for (std::size_t i = 0; i < shuffled_facets.size() for (std::size_t i = 0; i < shuffled_facets.size()
&& m_proxies.size() < max_nb_proxies; ++i) && m_proxies.size() < max_nb_proxies; ++i)
m_proxies.push_back(fit_new_proxy(shuffled_facets[i], m_proxies.size())); m_proxies.push_back(fit_proxy_from_seed_facet(shuffled_facets[i], m_proxies.size()));
run(num_iterations); run(num_iterations);
return m_proxies.size(); return m_proxies.size();
@ -1133,11 +1132,11 @@ private:
// reset proxies to the bootstrapped connected components // reset proxies to the bootstrapped connected components
m_proxies.clear(); m_proxies.clear();
BOOST_FOREACH(face_descriptor f, cc_seed_facets) BOOST_FOREACH(face_descriptor f, cc_seed_facets)
m_proxies.push_back(fit_new_proxy(f, m_proxies.size())); m_proxies.push_back(fit_proxy_from_seed_facet(f, m_proxies.size()));
for (std::size_t i = 0; i < shuffled_facets.size() for (std::size_t i = 0; i < shuffled_facets.size()
&& m_proxies.size() < target_px; ++i) && m_proxies.size() < target_px; ++i)
m_proxies.push_back(fit_new_proxy(shuffled_facets[i], m_proxies.size())); m_proxies.push_back(fit_proxy_from_seed_facet(shuffled_facets[i], m_proxies.size()));
run(num_iterations); run(num_iterations);
const FT err = compute_fitting_error(); const FT err = compute_fitting_error();
@ -1255,7 +1254,7 @@ private:
// update proxy parameters and seed // update proxy parameters and seed
for (ProxyWrapperIterator pxw_itr = beg; pxw_itr != end; ++pxw_itr) { for (ProxyWrapperIterator pxw_itr = beg; pxw_itr != end; ++pxw_itr) {
const std::size_t px_idx = pxw_itr->idx; const std::size_t px_idx = pxw_itr->idx;
*pxw_itr = fit_new_proxy(px_facets[px_idx].begin(), px_facets[px_idx].end(), px_idx); *pxw_itr = fit_proxy_from_patch(px_facets[px_idx], px_idx);
} }
} }
@ -1298,41 +1297,38 @@ private:
return false; return false;
put(m_fproxy_map, fworst, m_proxies.size()); put(m_fproxy_map, fworst, m_proxies.size());
m_proxies.push_back(fit_new_proxy(fworst, m_proxies.size())); m_proxies.push_back(fit_proxy_from_seed_facet(fworst, m_proxies.size()));
return true; return true;
} }
/*! /*!
* @brief Fitting a new (wrapped) proxy. * @brief Fitting a new (wrapped) proxy from a region patch.
* 1. Compute proxy parameters from a list of facets. * 1. Compute proxy parameters from a list of facets.
* 2. Find proxy seed. * 2. Find proxy seed facet.
* 3. Sum the proxy error. * 3. Sum the proxy error.
* @tparam FacetIterator face_descriptor container iterator * @tparam FacetPatch container with `face_descriptor` as data type
* @param beg container begin * @param px_patch proxy patch container
* @param end container end
* @param px_idx proxy index * @param px_idx proxy index
* @return fitted proxy wrapped with internal data * @return fitted wrapped proxy
*/ */
template<typename FacetIterator> template<typename FacetPatch>
Proxy_wrapper fit_new_proxy(const FacetIterator beg, Proxy_wrapper fit_proxy_from_patch(const FacetPatch &px_patch, const std::size_t px_idx) {
const FacetIterator end, CGAL_assertion(!px_patch.empty());
const std::size_t px_idx) {
CGAL_assertion(beg != end);
// use Proxy_fitting functor to fit proxy parameters // use Proxy_fitting functor to fit proxy parameters
const Proxy px = (*m_pproxy_fitting)(beg, end); const Proxy px = (*m_pproxy_fitting)(px_patch.begin(), px_patch.end());
// find proxy seed and sum error // find proxy seed and sum error
face_descriptor seed = *beg; face_descriptor seed = *px_patch.begin();
FT err_min = (*m_perror_metric)(*beg, px); FT err_min = (*m_perror_metric)(seed, px);
FT sum_error(0.0); FT sum_error(0.0);
for (FacetIterator fitr = beg; fitr != end; ++fitr) { BOOST_FOREACH(face_descriptor f, px_patch) {
const FT err = (*m_perror_metric)(*fitr, px); const FT err = (*m_perror_metric)(f, px);
sum_error += err; sum_error += err;
if (err < err_min) { if (err < err_min) {
err_min = err; err_min = err;
seed = *fitr; seed = f;
} }
} }
@ -1340,15 +1336,15 @@ private:
} }
/*! /*!
* @brief Fitting a new (wrapped) proxy from a single facet. * @brief Fitting a new (wrapped) proxy from a seed facet.
* 1. Compute proxy parameters from one facet. * 1. Compute proxy parameters from the facet.
* 2. Find proxy seed. * 2. Set seed to this facet.
* 3. Sum the proxy error. * 3. Sum the proxy error.
* @param face_descriptor facet * @param face_descriptor facet
* @param px_idx proxy index * @param px_idx proxy index
* @return fitted proxy wrapped with internal data * @return fitted proxy wrapped with internal data
*/ */
Proxy_wrapper fit_new_proxy(const face_descriptor f, const std::size_t px_idx) { Proxy_wrapper fit_proxy_from_seed_facet(const face_descriptor f, const std::size_t px_idx) {
// fit proxy parameters // fit proxy parameters
std::vector<face_descriptor> fvec(1, f); std::vector<face_descriptor> fvec(1, f);
const Proxy px = (*m_pproxy_fitting)(fvec.begin(), fvec.end()); const Proxy px = (*m_pproxy_fitting)(fvec.begin(), fvec.end());
@ -1439,7 +1435,7 @@ private:
m_proxies.clear(); m_proxies.clear();
BOOST_FOREACH(face_descriptor f, cc_seed_facets) BOOST_FOREACH(face_descriptor f, cc_seed_facets)
m_proxies.push_back(fit_new_proxy(f, m_proxies.size())); m_proxies.push_back(fit_proxy_from_seed_facet(f, m_proxies.size()));
#ifdef CGAL_SURFACE_MESH_APPROXIMATION_DEBUG #ifdef CGAL_SURFACE_MESH_APPROXIMATION_DEBUG
std::cerr << "#cc " << m_proxies.size() << std::endl; std::cerr << "#cc " << m_proxies.size() << std::endl;
#endif #endif