separate plane fitting from approximation traits

This commit is contained in:
Lingjie Zhu 2017-07-25 16:18:02 +08:00
parent f958f5616b
commit f4c40b1244
4 changed files with 39 additions and 51 deletions

View File

@ -100,7 +100,6 @@ struct ApproxTrait {
typedef PointProxy Proxy; typedef PointProxy Proxy;
typedef CompactMetric ErrorMetric; typedef CompactMetric ErrorMetric;
typedef PointProxyFitting ProxyFitting; typedef PointProxyFitting ProxyFitting;
typedef CGAL::PlaneFitting<Polyhedron> PlaneFitting;
ApproxTrait(const Polyhedron &_mesh, ApproxTrait(const Polyhedron &_mesh,
const VertexPointMap &_point_pmap, const VertexPointMap &_point_pmap,
@ -117,10 +116,6 @@ struct ApproxTrait {
return ProxyFitting(center_pmap, area_pmap, normal_pmap); return ProxyFitting(center_pmap, area_pmap, normal_pmap);
} }
PlaneFitting construct_plane_fitting_functor() const {
return PlaneFitting(mesh);
}
const Polyhedron &mesh; const Polyhedron &mesh;
const VertexPointMap point_pmap; const VertexPointMap point_pmap;
const FacetCenterMap center_pmap; const FacetCenterMap center_pmap;

View File

@ -400,14 +400,12 @@ private:
* @tparam FacetSegmentMap `WritablePropertyMap` with `boost::graph_traits<TriangleMesh>::face_handle` as key and `std::size_t` as value type * @tparam FacetSegmentMap `WritablePropertyMap` with `boost::graph_traits<TriangleMesh>::face_handle` as key and `std::size_t` as value type
*/ */
template <typename TriangleMesh, template <typename TriangleMesh,
typename ApproximationTraits,
typename VertexPointMap, typename VertexPointMap,
typename FacetSegmentMap> typename FacetSegmentMap,
typename PlaneFitting = typename CGAL::PlaneFitting<TriangleMesh>,
typename GeomTraits = typename TriangleMesh::Traits>
class VSA_mesh_extraction class VSA_mesh_extraction
{ {
typedef typename ApproximationTraits::GeomTraits GeomTraits;
typedef typename ApproximationTraits::PlaneFitting PlaneFitting;
typedef typename GeomTraits::FT FT; typedef typename GeomTraits::FT FT;
typedef typename GeomTraits::Point_3 Point_3; typedef typename GeomTraits::Point_3 Point_3;
typedef typename GeomTraits::Vector_3 Vector_3; typedef typename GeomTraits::Vector_3 Vector_3;
@ -447,20 +445,19 @@ public:
/** /**
* Extracts the surface mesh from an approximation partition @a _seg_pmap of mesh @a _mesh. * Extracts the surface mesh from an approximation partition @a _seg_pmap of mesh @a _mesh.
* @param _mesh the approximated triangle mesh. * @param _mesh the approximated triangle mesh.
* @param _appx_trait approximation traits object. * @param _plane_fitting plane fitting function object.
* @param _point_pmap vertex point map of the input mesh. * @param _point_pmap vertex point map of the input mesh.
* @param _seg_pmap approximation partition. * @param _seg_pmap approximation partition.
*/ */
VSA_mesh_extraction(const TriangleMesh &_mesh, VSA_mesh_extraction(const TriangleMesh &_mesh,
const ApproximationTraits &_appx_trait, const PlaneFitting &_plane_fitting,
const VertexPointMap &_point_pmap, const VertexPointMap &_point_pmap,
const FacetSegmentMap &_seg_pmap) const FacetSegmentMap &_seg_pmap)
: mesh(_mesh), : mesh(_mesh),
point_pmap(_point_pmap), point_pmap(_point_pmap),
seg_pmap(_seg_pmap), seg_pmap(_seg_pmap),
vanchor_map(vertex_int_map), vanchor_map(vertex_int_map),
num_proxies(0), num_proxies(0) {
plane_fitting(_appx_trait.construct_plane_fitting_functor()) {
GeomTraits traits; GeomTraits traits;
vector_functor = traits.construct_vector_3_object(); vector_functor = traits.construct_vector_3_object();
scale_functor = traits.construct_scaled_vector_3_object(); scale_functor = traits.construct_scaled_vector_3_object();
@ -482,7 +479,7 @@ public:
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);
BOOST_FOREACH(const std::list<face_descriptor> &px_patch, px_facets) { BOOST_FOREACH(const std::list<face_descriptor> &px_patch, px_facets) {
px_planes.push_back(plane_fitting(px_patch.begin(), px_patch.end())); px_planes.push_back(_plane_fitting(px_patch.begin(), px_patch.end()));
Vector_3 norm = CGAL::NULL_VECTOR; Vector_3 norm = CGAL::NULL_VECTOR;
FT area(0); FT area(0);
@ -1068,9 +1065,6 @@ private:
// All borders cycles. // All borders cycles.
std::vector<Border> borders; std::vector<Border> borders;
// The proxy plane fitting functor.
PlaneFitting plane_fitting;
}; // end class VSA_mesh_extraction }; // end class VSA_mesh_extraction
} // end namespace internal } // end namespace internal

View File

@ -26,6 +26,7 @@ namespace CGAL
* @tparam AnchorPositionContainer a container of extracted anchor position * @tparam AnchorPositionContainer a container of extracted anchor position
* @tparam AnchorVertexContainer a container of extracted anchor vertex * @tparam AnchorVertexContainer a container of extracted anchor vertex
* @tparam BoundaryContainer a container of proxy patch boundary * @tparam BoundaryContainer a container of proxy patch boundary
* @tparam PlaneFitting a plane fitting functor
* @tparam ApproximationTrait an approximation trait * @tparam ApproximationTrait an approximation trait
* @param init select seed initialization * @param init select seed initialization
@ -47,6 +48,7 @@ template<typename TriangleMesh,
typename AnchorPositionContainer, typename AnchorPositionContainer,
typename AnchorVertexContainer, typename AnchorVertexContainer,
typename BoundaryContainer, typename BoundaryContainer,
typename PlaneFitting,
typename ApproximationTrait> typename ApproximationTrait>
void vsa_mesh_approximation( void vsa_mesh_approximation(
const int init, const int init,
@ -59,6 +61,7 @@ void vsa_mesh_approximation(
AnchorPositionContainer &pos, AnchorPositionContainer &pos,
AnchorVertexContainer &vtx, AnchorVertexContainer &vtx,
BoundaryContainer &bdrs, BoundaryContainer &bdrs,
const PlaneFitting &_plane_fitting,
const ApproximationTrait &app_trait) { const ApproximationTrait &app_trait) {
// CGAL_precondition(is_pure_triangle(tm)); // CGAL_precondition(is_pure_triangle(tm));
@ -71,11 +74,12 @@ void vsa_mesh_approximation(
typedef CGAL::internal::VSA_mesh_extraction< typedef CGAL::internal::VSA_mesh_extraction<
TriangleMesh, TriangleMesh,
ApproximationTrait,
VertexPointMap, VertexPointMap,
FacetProxyMap> VSA_mesh_extraction; FacetProxyMap,
PlaneFitting,
ApproximationTrait::GeomTraits> VSA_mesh_extraction;
VSA_mesh_extraction extractor(tm, app_trait, v_point_pmap, f_proxy_pmap); VSA_mesh_extraction extractor(tm, _plane_fitting, v_point_pmap, f_proxy_pmap);
extractor.extract_mesh(tris); extractor.extract_mesh(tris);
BOOST_FOREACH(const typename VSA_mesh_extraction::Anchor &a, extractor.collect_anchors()) { BOOST_FOREACH(const typename VSA_mesh_extraction::Anchor &a, extractor.collect_anchors()) {
@ -147,6 +151,7 @@ void vsa_approximate(
* @tparam TriangleMesh model of `FaceGraph`. * @tparam TriangleMesh model of `FaceGraph`.
* @tparam AnchorIndexContainer a container of approximated indexed triangle soup * @tparam AnchorIndexContainer a container of approximated indexed triangle soup
* @tparam AnchorPositionContainer a container of extracted anchor position * @tparam AnchorPositionContainer a container of extracted anchor position
* @tparam PlaneFitting a plane fitting functor
* @tparam ApproximationTrait an approximation trait * @tparam ApproximationTrait an approximation trait
* @param tm a triangle mesh * @param tm a triangle mesh
@ -160,11 +165,13 @@ void vsa_approximate(
template<typename TriangleMesh, template<typename TriangleMesh,
typename AnchorIndexContainer, typename AnchorIndexContainer,
typename AnchorPositionContainer, typename AnchorPositionContainer,
typename PlaneFitting,
typename ApproximationTrait> typename ApproximationTrait>
void vsa_extract( void vsa_extract(
const TriangleMesh &tm, const TriangleMesh &tm,
AnchorIndexContainer &tris, AnchorIndexContainer &tris,
AnchorPositionContainer &pos, AnchorPositionContainer &pos,
const PlaneFitting &_plane_fitting,
const ApproximationTrait &app_trait, const ApproximationTrait &app_trait,
const int init, const int init,
const std::size_t number_of_segments, const std::size_t number_of_segments,
@ -188,12 +195,13 @@ void vsa_extract(
typedef typename boost::property_map<TriangleMesh, boost::vertex_point_t>::type VertexPointMap; typedef typename boost::property_map<TriangleMesh, boost::vertex_point_t>::type VertexPointMap;
typedef CGAL::internal::VSA_mesh_extraction< typedef CGAL::internal::VSA_mesh_extraction<
TriangleMesh, TriangleMesh,
ApproximationTrait,
VertexPointMap, VertexPointMap,
FacetProxyMap> VSA_mesh_extraction; FacetProxyMap,
PlaneFitting,
ApproximationTrait::GeomTraits> VSA_mesh_extraction;
VSA_mesh_extraction extractor(tm, VSA_mesh_extraction extractor(tm,
app_trait, _plane_fitting,
get(boost::vertex_point, const_cast<TriangleMesh &>(tm)), get(boost::vertex_point, const_cast<TriangleMesh &>(tm)),
f_proxy_pmap); f_proxy_pmap);
@ -214,6 +222,7 @@ void vsa_extract(
std::size_t as value type std::size_t as value type
* @tparam AnchorIndexContainer a container of approximated indexed triangle soup * @tparam AnchorIndexContainer a container of approximated indexed triangle soup
* @tparam AnchorPositionContainer a container of extracted anchor position * @tparam AnchorPositionContainer a container of extracted anchor position
* @tparam PlaneFitting a plane fitting functor
* @tparam ApproximationTrait an approximation trait * @tparam ApproximationTrait an approximation trait
* @param tm a triangle mesh * @param tm a triangle mesh
@ -229,12 +238,14 @@ template<typename TriangleMesh,
typename FacetProxyMap, typename FacetProxyMap,
typename AnchorIndexContainer, typename AnchorIndexContainer,
typename AnchorPositionContainer, typename AnchorPositionContainer,
typename PlaneFitting,
typename ApproximationTrait> typename ApproximationTrait>
void vsa_approximate_and_extract( void vsa_approximate_and_extract(
const TriangleMesh &tm, const TriangleMesh &tm,
FacetProxyMap f_proxy_pmap, FacetProxyMap f_proxy_pmap,
AnchorIndexContainer &tris, AnchorIndexContainer &tris,
AnchorPositionContainer &pos, AnchorPositionContainer &pos,
const PlaneFitting &_plane_fitting,
const ApproximationTrait &app_trait, const ApproximationTrait &app_trait,
const int init, const int init,
const std::size_t number_of_segments, const std::size_t number_of_segments,
@ -251,12 +262,13 @@ void vsa_approximate_and_extract(
typedef typename boost::property_map<TriangleMesh, boost::vertex_point_t>::type VertexPointMap; typedef typename boost::property_map<TriangleMesh, boost::vertex_point_t>::type VertexPointMap;
typedef CGAL::internal::VSA_mesh_extraction< typedef CGAL::internal::VSA_mesh_extraction<
TriangleMesh, TriangleMesh,
ApproximationTrait,
VertexPointMap, VertexPointMap,
FacetProxyMap> VSA_mesh_extraction; FacetProxyMap,
PlaneFitting,
ApproximationTrait::GeomTraits> VSA_mesh_extraction;
VSA_mesh_extraction extractor(tm, VSA_mesh_extraction extractor(tm,
app_trait, _plane_fitting,
get(boost::vertex_point, const_cast<TriangleMesh &>(tm)), get(boost::vertex_point, const_cast<TriangleMesh &>(tm)),
f_proxy_pmap); f_proxy_pmap);
@ -306,8 +318,7 @@ void vsa_approximate(
typedef CGAL::PlaneProxy<TriangleMesh> PlaneProxy; typedef CGAL::PlaneProxy<TriangleMesh> PlaneProxy;
typedef CGAL::L21Metric<PlaneProxy, FacetNormalMap, FacetAreaMap> L21Metric; typedef CGAL::L21Metric<PlaneProxy, FacetNormalMap, FacetAreaMap> L21Metric;
typedef CGAL::L21ProxyFitting<PlaneProxy, L21Metric, FacetNormalMap, FacetAreaMap> L21ProxyFitting; typedef CGAL::L21ProxyFitting<PlaneProxy, L21Metric, FacetNormalMap, FacetAreaMap> L21ProxyFitting;
typedef CGAL::PlaneFitting<TriangleMesh> PlaneFitting; typedef CGAL::L21ApproximationTrait<PlaneProxy, TriangleMesh, L21Metric, L21ProxyFitting, VertexPointMap, FacetNormalMap, FacetAreaMap> L21ApproximationTrait;
typedef CGAL::L21ApproximationTrait<PlaneProxy, TriangleMesh, L21Metric, L21ProxyFitting, PlaneFitting, VertexPointMap, FacetNormalMap, FacetAreaMap> L21ApproximationTrait;
VertexPointMap point_pmap = get(boost::vertex_point, const_cast<TriangleMesh &>(tm)); VertexPointMap point_pmap = get(boost::vertex_point, const_cast<TriangleMesh &>(tm));
// construct facet normal & area map // construct facet normal & area map
@ -378,7 +389,7 @@ void vsa_extract(
typedef CGAL::L21Metric<PlaneProxy, FacetNormalMap, FacetAreaMap> L21Metric; typedef CGAL::L21Metric<PlaneProxy, FacetNormalMap, FacetAreaMap> L21Metric;
typedef CGAL::L21ProxyFitting<PlaneProxy, L21Metric, FacetNormalMap, FacetAreaMap> L21ProxyFitting; typedef CGAL::L21ProxyFitting<PlaneProxy, L21Metric, FacetNormalMap, FacetAreaMap> L21ProxyFitting;
typedef CGAL::PlaneFitting<TriangleMesh> PlaneFitting; typedef CGAL::PlaneFitting<TriangleMesh> PlaneFitting;
typedef CGAL::L21ApproximationTrait<PlaneProxy, TriangleMesh, L21Metric, L21ProxyFitting, PlaneFitting, VertexPointMap, FacetNormalMap, FacetAreaMap> L21ApproximationTrait; typedef CGAL::L21ApproximationTrait<PlaneProxy, TriangleMesh, L21Metric, L21ProxyFitting, VertexPointMap, FacetNormalMap, FacetAreaMap> L21ApproximationTrait;
VertexPointMap point_pmap = get(boost::vertex_point, const_cast<TriangleMesh &>(tm)); VertexPointMap point_pmap = get(boost::vertex_point, const_cast<TriangleMesh &>(tm));
// construct facet normal & area map // construct facet normal & area map
@ -406,6 +417,7 @@ void vsa_extract(
vsa_extract(tm, vsa_extract(tm,
tris, tris,
pos, pos,
PlaneFitting(tm),
L21ApproximationTrait(tm, point_pmap, normal_pmap, area_pmap), L21ApproximationTrait(tm, point_pmap, normal_pmap, area_pmap),
init, init,
number_of_segments, number_of_segments,
@ -462,7 +474,7 @@ void vsa_approximate_and_extract(
typedef CGAL::L21Metric<PlaneProxy, FacetNormalMap, FacetAreaMap> L21Metric; typedef CGAL::L21Metric<PlaneProxy, FacetNormalMap, FacetAreaMap> L21Metric;
typedef CGAL::L21ProxyFitting<PlaneProxy, L21Metric, FacetNormalMap, FacetAreaMap> L21ProxyFitting; typedef CGAL::L21ProxyFitting<PlaneProxy, L21Metric, FacetNormalMap, FacetAreaMap> L21ProxyFitting;
typedef CGAL::PlaneFitting<TriangleMesh> PlaneFitting; typedef CGAL::PlaneFitting<TriangleMesh> PlaneFitting;
typedef CGAL::L21ApproximationTrait<PlaneProxy, TriangleMesh, L21Metric, L21ProxyFitting, PlaneFitting, VertexPointMap, FacetNormalMap, FacetAreaMap> L21ApproximationTrait; typedef CGAL::L21ApproximationTrait<PlaneProxy, TriangleMesh, L21Metric, L21ProxyFitting, VertexPointMap, FacetNormalMap, FacetAreaMap> L21ApproximationTrait;
VertexPointMap point_pmap = get(boost::vertex_point, const_cast<TriangleMesh &>(tm)); VertexPointMap point_pmap = get(boost::vertex_point, const_cast<TriangleMesh &>(tm));
// construct facet normal & area map // construct facet normal & area map
@ -486,6 +498,7 @@ void vsa_approximate_and_extract(
f_proxy_pmap, f_proxy_pmap,
tris, tris,
pos, pos,
PlaneFitting(tm),
app_trait, app_trait,
init, init,
number_of_segments, number_of_segments,

View File

@ -153,11 +153,11 @@ template<typename TriangleMesh,
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
template<typename FacetIterator> template<typename FacetIterator>
Plane_3 operator()(const FacetIterator &beg, const FacetIterator &end) { Plane_3 operator()(const FacetIterator &beg, const FacetIterator &end) const {
CGAL_assertion(beg != end); CGAL_assertion(beg != end);
// area average normal and centroid // area average normal and centroid
Vector_3 norm = CGAL::NULL_VECTOR; Vector_3 norm = CGAL::NULL_VECTOR;
Vector_3 centroid = CGAL::NULL_VECTOR; Vector_3 cent = CGAL::NULL_VECTOR;
FT sum_area(0); FT sum_area(0);
for (FacetIterator fitr = beg; fitr != end; ++fitr) { for (FacetIterator fitr = beg; fitr != end; ++fitr) {
const halfedge_descriptor he = halfedge(*fitr, mesh); const halfedge_descriptor he = halfedge(*fitr, mesh);
@ -170,14 +170,14 @@ template<typename TriangleMesh,
Vector_3 fnorm = CGAL::unit_normal(p0, p1, p2); Vector_3 fnorm = CGAL::unit_normal(p0, p1, p2);
norm = sum_functor(norm, scale_functor(fnorm, farea)); norm = sum_functor(norm, scale_functor(fnorm, farea));
centroid = sum_functor(centroid, scale_functor(vec, farea)); cent = sum_functor(cent, scale_functor(vec, farea));
sum_area += farea; sum_area += farea;
} }
norm = scale_functor(norm, norm = scale_functor(norm,
FT(1.0 / std::sqrt(CGAL::to_double(norm.squared_length())))); FT(1.0 / std::sqrt(CGAL::to_double(norm.squared_length()))));
centroid = scale_functor(centroid, FT(1) / sum_area); cent = scale_functor(cent, FT(1) / sum_area);
return Plane_3(CGAL::ORIGIN + centroid, norm); return Plane_3(CGAL::ORIGIN + cent, norm);
} }
const TriangleMesh &mesh; const TriangleMesh &mesh;
@ -192,7 +192,6 @@ template<typename PlaneProxy,
typename TriangleMesh, typename TriangleMesh,
typename L21ErrorMetric, typename L21ErrorMetric,
typename L21ProxyFitting, typename L21ProxyFitting,
typename L21PlaneFitting,
typename VertexPointMap, typename VertexPointMap,
typename FacetNormalMap, typename FacetNormalMap,
typename FacetAreaMap> typename FacetAreaMap>
@ -202,7 +201,6 @@ template<typename PlaneProxy,
typedef PlaneProxy Proxy; typedef PlaneProxy Proxy;
typedef L21ErrorMetric ErrorMetric; typedef L21ErrorMetric ErrorMetric;
typedef L21ProxyFitting ProxyFitting; typedef L21ProxyFitting ProxyFitting;
typedef L21PlaneFitting PlaneFitting;
L21ApproximationTrait( L21ApproximationTrait(
const TriangleMesh &_mesh, const TriangleMesh &_mesh,
@ -225,11 +223,6 @@ template<typename PlaneProxy,
return ProxyFitting(normal_pmap, area_pmap); return ProxyFitting(normal_pmap, area_pmap);
} }
// construct plane fitting functor
L21PlaneFitting construct_plane_fitting_functor() const {
return L21PlaneFitting(mesh, point_pmap);
}
private: private:
const TriangleMesh &mesh; const TriangleMesh &mesh;
const VertexPointMap point_pmap; const VertexPointMap point_pmap;
@ -362,7 +355,7 @@ template<typename TriangleMesh,
} }
template<typename FacetIterator> template<typename FacetIterator>
Plane_3 operator()(const FacetIterator beg, const FacetIterator end) { Plane_3 operator()(const FacetIterator beg, const FacetIterator end) const {
CGAL_assertion(beg != end); CGAL_assertion(beg != end);
std::list<Triangle_3> tris; std::list<Triangle_3> tris;
@ -401,7 +394,6 @@ template<typename TriangleMesh,
typename PlaneProxy, typename PlaneProxy,
typename L2ErrorMetric, typename L2ErrorMetric,
typename L2ProxyFitting, typename L2ProxyFitting,
typename PCAPlaneFitting,
typename VertexPointMap, typename VertexPointMap,
typename FacetAreaMap> typename FacetAreaMap>
struct L2ApproximationTrait struct L2ApproximationTrait
@ -411,7 +403,6 @@ public:
typedef PlaneProxy Proxy; typedef PlaneProxy Proxy;
typedef L2ErrorMetric ErrorMetric; typedef L2ErrorMetric ErrorMetric;
typedef L2ProxyFitting ProxyFitting; typedef L2ProxyFitting ProxyFitting;
typedef PCAPlaneFitting PlaneFitting;
L2ApproximationTrait( L2ApproximationTrait(
const TriangleMesh &_mesh, const TriangleMesh &_mesh,
@ -433,11 +424,6 @@ public:
return ProxyFitting(mesh, point_pmap, area_pmap); return ProxyFitting(mesh, point_pmap, area_pmap);
} }
// construct plane fitting functor
PlaneFitting construct_plane_fitting_functor() const {
return PlaneFitting(mesh, point_pmap);
}
private: private:
const TriangleMesh &mesh; const TriangleMesh &mesh;
const VertexPointMap point_pmap; const VertexPointMap point_pmap;