Subject: CGAL users discussion list
List archive
- From: "Sebastien Loriot (GeometryFactory)" <>
- To:
- Subject: Re: [cgal-discuss] compilation error with jet_smooth_point
- Date: Thu, 23 Jan 2014 16:35:09 +0100
- Organization: GeometryFactory
I joint the modified files.
Sebastien.
On 01/23/2014 10:44 AM, Arnaud Gelas wrote:
Thanks for fixing it!
Could you also attach the patch, then I can submit a bug report along with
the patch for debian package, please?
Thanks
Arnaud
On Jan 23, 2014, at 10:35 AM, "Sebastien Loriot (GeometryFactory)"
<>
wrote:
Indeed that was a bug not caught by our testsuite.
I fixed the bug for the next release.
Thanks for the report,
Sebastien.
On 01/22/2014 02:16 PM, Arnaud Gelas wrote:
#include <CGAL/jet_smooth_point_set.h>
void main()
{}
---
If you just try to compile this example in the case where CGAL_EIGEN3_ENABLED
and CGAL_LAPACK_ENABLED, it won't compileā¦
Cause Monge_via_jet_fitting expect 3 template parameters but the typedef in
jet_smooth_point_set only provides one.
It seems to me that it has only been tested with eigen3, or lapack (?)
On Jan 22, 2014, at 1:57 PM, "Sebastien Loriot (GeometryFactory)"
<>
wrote:
Can you show a minimal example showing the pb?
When those macros are defined, it activates some defaults for some
template parameter. If they are not, then you need to specify
them by end.
Sebastien.
On 01/22/2014 01:23 PM, Arnaud Gelas wrote:
Hi all,
I use debian testing packages for debian (i.e. 4.2.5), and I get an obvious
compilation error when using jet_smooth_point.
Indeed if CGAL_EIGEN3_ENABLED and CGAL_LACPACK_ENABLED are not defined,
Monge_via_jet_fitting requires 3 template arguments (there are no default
template arguments for LocalKernel and for SvdTraits), and in
jet_smooth_point only 1 template parameter is provided for Monge_jet_fittingā¦
Has the code been fixed in latest release (4.2.3) ?
Thanks,
Arnaud
--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://sympa.inria.fr/sympa/info/cgal-discuss
--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://sympa.inria.fr/sympa/info/cgal-discuss
// Copyright (c) 2007-09 INRIA Sophia-Antipolis (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // You can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // // Author(s) : Pierre Alliez and Laurent Saboret and Marc Pouget and Frederic Cazals #ifndef CGAL_JET_ESTIMATE_NORMALS_H #define CGAL_JET_ESTIMATE_NORMALS_H #include <CGAL/trace.h> #include <CGAL/Search_traits_3.h> #include <CGAL/Orthogonal_k_neighbor_search.h> #include <CGAL/Monge_via_jet_fitting.h> #include <CGAL/property_map.h> #include <CGAL/point_set_processing_assertions.h> #include <CGAL/Memory_sizer.h> #include <iterator> #include <list> namespace CGAL { // ---------------------------------------------------------------------------- // Private section // ---------------------------------------------------------------------------- namespace internal { /// \cond SKIP_IN_MANUAL /// Estimates normal direction using jet fitting /// on the k nearest neighbors. /// /// \pre `k >= 2` /// /// @tparam Kernel Geometric traits class. /// @tparam Tree KD-tree. /// /// @return Computed normal. Orientation is random. template < typename Kernel, typename SvdTraits, typename Tree > typename Kernel::Vector_3 jet_estimate_normal(const typename Kernel::Point_3& query, ///< point to compute the normal at Tree& tree, ///< KD-tree unsigned int k, ///< number of neighbors unsigned int degree_fitting) { // basic geometric types typedef typename Kernel::Point_3 Point; // types for K nearest neighbors search typedef typename CGAL::Search_traits_3<Kernel> Tree_traits; typedef typename CGAL::Orthogonal_k_neighbor_search<Tree_traits> Neighbor_search; typedef typename Neighbor_search::iterator Search_iterator; // types for jet fitting typedef Monge_via_jet_fitting< Kernel, Simple_cartesian<double>, SvdTraits> Monge_jet_fitting; typedef typename Monge_jet_fitting::Monge_form Monge_form; // Gather set of (k+1) neighboring points. // Perform k+1 queries (as in point set, the query point is // output first). Search may be aborted if k is greater // than number of input points. std::vector<Point> points; points.reserve(k+1); Neighbor_search search(tree,query,k+1); Search_iterator search_iterator = search.begin(); unsigned int i; for(i=0;i<(k+1);i++) { if(search_iterator == search.end()) break; // premature ending points.push_back(search_iterator->first); search_iterator++; } CGAL_point_set_processing_precondition(points.size() >= 1); // performs jet fitting Monge_jet_fitting monge_fit; const unsigned int degree_monge = 1; // we seek for normal and not more. Monge_form monge_form = monge_fit(points.begin(), points.end(), degree_fitting, degree_monge); // output normal vector (already normalized in monge form) return monge_form.normal_direction(); } /// \endcond } /* namespace internal */ // ---------------------------------------------------------------------------- // Public section // ---------------------------------------------------------------------------- /// \ingroup PkgPointSetProcessing /// Estimates normal directions of the `[first, beyond)` range of points /// using jet fitting on the k nearest neighbors. /// The output normals are randomly oriented. /// /// \pre `k >= 2` /// /// /// @tparam ForwardIterator iterator model of the concept of the same name over input points and able to store output normals. /// @tparam PointPMap is a model of `ReadablePropertyMap` with a value_type = Point_3<Kernel>. /// It can be omitted if ForwardIterator value_type is convertible to Point_3<Kernel>. /// @tparam NormalPMap is a model of `WritablePropertyMap` with a value_type = Vector_3<Kernel>. /// @tparam Kernel Geometric traits class. /// It can be omitted and deduced automatically from PointPMap value_type. /// @tparam SvdTraits template parameter for the class `Monge_via_jet_fitting` that /// can be ommited in conditions described in the documentation of `Monge_via_jet_fitting`. // This variant requires all parameters. template <typename ForwardIterator, typename PointPMap, typename NormalPMap, typename Kernel, typename SvdTraits > void jet_estimate_normals( ForwardIterator first, ///< iterator over the first input point. ForwardIterator beyond, ///< past-the-end iterator over the input points. PointPMap point_pmap, ///< property map: value_type of ForwardIterator -> Point_3. NormalPMap normal_pmap, ///< property map: value_type of ForwardIterator -> Vector_3. unsigned int k, ///< number of neighbors. const Kernel& /*kernel*/, ///< geometric traits. unsigned int degree_fitting = 2) ///< fitting degree { CGAL_TRACE("Calls jet_estimate_normals()\n"); // basic geometric types typedef typename Kernel::Point_3 Point; // Input points types typedef typename boost::property_traits<NormalPMap>::value_type Vector; // types for K nearest neighbors search structure typedef typename CGAL::Search_traits_3<Kernel> Tree_traits; typedef typename CGAL::Orthogonal_k_neighbor_search<Tree_traits> Neighbor_search; typedef typename Neighbor_search::Tree Tree; // precondition: at least one element in the container. // to fix: should have at least three distinct points // but this is costly to check CGAL_point_set_processing_precondition(first != beyond); // precondition: at least 2 nearest neighbors CGAL_point_set_processing_precondition(k >= 2); std::size_t memory = CGAL::Memory_sizer().virtual_size(); CGAL_TRACE(" %ld Mb allocated\n", memory>>20); CGAL_TRACE(" Creates KD-tree\n"); ForwardIterator it; // Instanciate a KD-tree search. // Note: We have to convert each input iterator to Point_3. std::vector<Point> kd_tree_points; for(it = first; it != beyond; it++) { #ifdef CGAL_USE_PROPERTY_MAPS_API_V1 Point point = get(point_pmap, it); #else Point point = get(point_pmap, *it); #endif kd_tree_points.push_back(point); } Tree tree(kd_tree_points.begin(), kd_tree_points.end()); memory = CGAL::Memory_sizer().virtual_size(); CGAL_TRACE(" %ld Mb allocated\n", memory>>20); CGAL_TRACE(" Computes normals\n"); // iterate over input points, compute and output normal // vectors (already normalized) for(it = first; it != beyond; it++) { Vector normal = internal::jet_estimate_normal<Kernel,SvdTraits,Tree>( #ifdef CGAL_USE_PROPERTY_MAPS_API_V1 get(point_pmap,it), #else get(point_pmap,*it), #endif tree, k, degree_fitting); #ifdef CGAL_USE_PROPERTY_MAPS_API_V1 put(normal_pmap, it, normal); // normal_pmap[it] = normal #else put(normal_pmap, *it, normal); // normal_pmap[it] = normal #endif } memory = CGAL::Memory_sizer().virtual_size(); CGAL_TRACE(" %ld Mb allocated\n", memory>>20); CGAL_TRACE("End of jet_estimate_normals()\n"); } #if defined(CGAL_EIGEN3_ENABLED) || defined(CGAL_LAPACK_ENABLED) /// @cond SKIP_IN_MANUAL template <typename ForwardIterator, typename PointPMap, typename NormalPMap, typename Kernel > void jet_estimate_normals( ForwardIterator first, ForwardIterator beyond, PointPMap point_pmap, NormalPMap normal_pmap, unsigned int k, const Kernel& kernel, unsigned int degree_fitting = 2) { #ifdef CGAL_EIGEN3_ENABLED typedef Eigen_svd SvdTraits; #else typedef Lapack_svd SvdTraits; #endif jet_estimate_normals<ForwardIterator,PointPMap,NormalPMap,Kernel,SvdTraits>( first, beyond, point_pmap, normal_pmap, k, kernel, degree_fitting); } /// @cond SKIP_IN_MANUAL // This variant deduces the kernel from the point property map. template <typename ForwardIterator, typename PointPMap, typename NormalPMap > void jet_estimate_normals( ForwardIterator first, ///< iterator over the first input point. ForwardIterator beyond, ///< past-the-end iterator over the input points. PointPMap point_pmap, ///< property map: value_type of ForwardIterator -> Point_3. NormalPMap normal_pmap, ///< property map: value_type of ForwardIterator -> Vector_3. unsigned int k, ///< number of neighbors. unsigned int degree_fitting = 2) { typedef typename boost::property_traits<PointPMap>::value_type Point; typedef typename Kernel_traits<Point>::Kernel Kernel; jet_estimate_normals( first,beyond, point_pmap, normal_pmap, k, Kernel(), degree_fitting); } /// @endcond /// @cond SKIP_IN_MANUAL // This variant creates a default point property map = Identity_property_map. template <typename ForwardIterator, typename NormalPMap > void jet_estimate_normals( ForwardIterator first, ///< iterator over the first input point. ForwardIterator beyond, ///< past-the-end iterator over the input points. NormalPMap normal_pmap, ///< property map: value_type of ForwardIterator -> Vector_3. unsigned int k, ///< number of neighbors. unsigned int degree_fitting = 2) { jet_estimate_normals( first,beyond, #ifdef CGAL_USE_PROPERTY_MAPS_API_V1 make_dereference_property_map(first), #else make_identity_property_map( typename std::iterator_traits<ForwardIterator>::value_type()), #endif normal_pmap, k, degree_fitting); } /// @endcond #endif } //namespace CGAL #endif // CGAL_JET_ESTIMATE_NORMALS_H
// Copyright (c) 2007-09 INRIA Sophia-Antipolis (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // You can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // // Author(s) : Pierre Alliez, Marc Pouget and Laurent Saboret #ifndef CGAL_JET_SMOOTH_POINT_SET_H #define CGAL_JET_SMOOTH_POINT_SET_H #include <CGAL/trace.h> #include <CGAL/Search_traits_3.h> #include <CGAL/Orthogonal_k_neighbor_search.h> #include <CGAL/Monge_via_jet_fitting.h> #include <CGAL/property_map.h> #include <CGAL/point_set_processing_assertions.h> #include <iterator> #include <list> namespace CGAL { // ---------------------------------------------------------------------------- // Private section // ---------------------------------------------------------------------------- namespace internal { /// \cond SKIP_IN_MANUAL /// Smoothes one point position using jet fitting on the k /// nearest neighbors and reprojection onto the jet. /// /// \pre `k >= 2` /// /// @tparam Kernel Geometric traits class. /// @tparam Tree KD-tree. /// /// @return computed point template <typename Kernel, typename SvdTraits, typename Tree > typename Kernel::Point_3 jet_smooth_point( const typename Kernel::Point_3& query, ///< 3D point to project Tree& tree, ///< KD-tree const unsigned int k, ///< number of neighbors. const unsigned int degree_fitting, const unsigned int degree_monge) { // basic geometric types typedef typename Kernel::Point_3 Point; // types for K nearest neighbors search typedef typename CGAL::Search_traits_3<Kernel> Tree_traits; typedef typename CGAL::Orthogonal_k_neighbor_search<Tree_traits> Neighbor_search; typedef typename Neighbor_search::iterator Search_iterator; // types for jet fitting typedef Monge_via_jet_fitting< Kernel, Simple_cartesian<double>, SvdTraits> Monge_jet_fitting; typedef typename Monge_jet_fitting::Monge_form Monge_form; // Gather set of (k+1) neighboring points. // Performs k + 1 queries (if unique the query point is // output first). Search may be aborted if k is greater // than number of input points. std::vector<Point> points; points.reserve(k+1); Neighbor_search search(tree,query,k+1); Search_iterator search_iterator = search.begin(); unsigned int i; for(i=0;i<(k+1);i++) { if(search_iterator == search.end()) break; // premature ending points.push_back(search_iterator->first); search_iterator++; } CGAL_point_set_processing_precondition(points.size() >= 1); // performs jet fitting Monge_jet_fitting monge_fit; Monge_form monge_form = monge_fit(points.begin(), points.end(), degree_fitting, degree_monge); // output projection of query point onto the jet return monge_form.origin(); } /// \endcond } /* namespace internal */ // ---------------------------------------------------------------------------- // Public section // ---------------------------------------------------------------------------- /// \ingroup PkgPointSetProcessing /// Smoothes the `[first, beyond)` range of points using jet fitting on the k /// nearest neighbors and reprojection onto the jet. /// As this method relocates the points, it /// should not be called on containers sorted w.r.t. point locations. /// /// \pre `k >= 2` /// /// @tparam InputIterator iterator over input points. /// @tparam PointPMap is a model of `ReadWritePropertyMap` with a value_type = Point_3<Kernel>. /// It can be omitted if InputIterator value_type is convertible to Point_3<Kernel>. /// @tparam Kernel Geometric traits class. /// It can be omitted and deduced automatically from PointPMap value_type. /// @tparam SvdTraits template parameter for the class `Monge_via_jet_fitting` that /// can be ommited in conditions described in the documentation of `Monge_via_jet_fitting`. // This variant requires all parameters. template <typename InputIterator, typename PointPMap, typename Kernel, typename SvdTraits > void jet_smooth_point_set( InputIterator first, ///< iterator over the first input point. InputIterator beyond, ///< past-the-end iterator over the input points. PointPMap point_pmap, ///< property map: value_type of InputIterator -> Point_3. unsigned int k, ///< number of neighbors. const Kernel& /*kernel*/, ///< geometric traits. unsigned int degree_fitting = 2, ///< fitting degree unsigned int degree_monge = 2) ///< Monge degree { // basic geometric types typedef typename Kernel::Point_3 Point; // types for K nearest neighbors search structure typedef typename CGAL::Search_traits_3<Kernel> Tree_traits; typedef typename CGAL::Orthogonal_k_neighbor_search<Tree_traits> Neighbor_search; typedef typename Neighbor_search::Tree Tree; // precondition: at least one element in the container. // to fix: should have at least three distinct points // but this is costly to check CGAL_point_set_processing_precondition(first != beyond); // precondition: at least 2 nearest neighbors CGAL_point_set_processing_precondition(k >= 2); InputIterator it; // Instanciate a KD-tree search. // Note: We have to convert each input iterator to Point_3. std::vector<Point> kd_tree_points; for(it = first; it != beyond; it++) { #ifdef CGAL_USE_PROPERTY_MAPS_API_V1 Point point = get(point_pmap, it); #else Point point = get(point_pmap, *it); #endif kd_tree_points.push_back(point); } Tree tree(kd_tree_points.begin(), kd_tree_points.end()); // Iterates over input points and mutates them. // Implementation note: the cast to Point& allows to modify only the point's position. for(it = first; it != beyond; it++) { #ifdef CGAL_USE_PROPERTY_MAPS_API_V1 const Point& p = get(point_pmap, it); put(point_pmap, it , internal::jet_smooth_point<Kernel, SvdTraits>( p,tree,k,degree_fitting,degree_monge) ); #else const Point& p = get(point_pmap, *it); put(point_pmap, *it , internal::jet_smooth_point<Kernel, SvdTraits>( p,tree,k,degree_fitting,degree_monge) ); #endif } } #if defined(CGAL_EIGEN3_ENABLED) || defined(CGAL_LAPACK_ENABLED) /// @cond SKIP_IN_MANUAL template <typename InputIterator, typename PointPMap, typename Kernel > void jet_smooth_point_set( InputIterator first, ///< iterator over the first input point. InputIterator beyond, ///< past-the-end iterator over the input points. PointPMap point_pmap, ///< property map: value_type of InputIterator -> Point_3. unsigned int k, ///< number of neighbors. const Kernel& kernel, ///< geometric traits. unsigned int degree_fitting = 2, ///< fitting degree unsigned int degree_monge = 2) ///< Monge degree { #ifdef CGAL_EIGEN3_ENABLED typedef Eigen_svd SvdTraits; #else typedef Lapack_svd SvdTraits; #endif jet_smooth_point_set<InputIterator, PointPMap, Kernel, SvdTraits>( first, beyond, point_pmap, k, kernel, degree_fitting, degree_monge); } /// @cond SKIP_IN_MANUAL // This variant deduces the kernel from the point property map. template <typename InputIterator, typename PointPMap > void jet_smooth_point_set( InputIterator first, ///< iterator over the first input point InputIterator beyond, ///< past-the-end iterator PointPMap point_pmap, ///< property map: value_type of InputIterator -> Point_3 unsigned int k, ///< number of neighbors. const unsigned int degree_fitting = 2, const unsigned int degree_monge = 2) { typedef typename boost::property_traits<PointPMap>::value_type Point; typedef typename Kernel_traits<Point>::Kernel Kernel; jet_smooth_point_set( first,beyond, point_pmap, k, Kernel(), degree_fitting,degree_monge); } /// @endcond /// @cond SKIP_IN_MANUAL // This variant creates a default point property map = Identity_property_map. template <typename InputIterator > void jet_smooth_point_set( InputIterator first, ///< iterator over the first input point InputIterator beyond, ///< past-the-end iterator unsigned int k, ///< number of neighbors. const unsigned int degree_fitting = 2, const unsigned int degree_monge = 2) { jet_smooth_point_set( first,beyond, #ifdef CGAL_USE_PROPERTY_MAPS_API_V1 make_dereference_property_map(first), #else make_identity_property_map( typename std::iterator_traits<InputIterator>::value_type()), #endif k, degree_fitting,degree_monge); } /// @endcond #endif } //namespace CGAL #endif // CGAL_JET_SMOOTH_POINT_SET_H
- [cgal-discuss] compilation error with jet_smooth_point, Arnaud Gelas, 01/22/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Sebastien Loriot (GeometryFactory), 01/22/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Arnaud Gelas, 01/22/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Sebastien Loriot (GeometryFactory), 01/23/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Arnaud Gelas, 01/23/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Sebastien Loriot (GeometryFactory), 01/23/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Arnaud Gelas, 01/23/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Sebastien Loriot (GeometryFactory), 01/23/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Arnaud Gelas, 01/22/2014
- Re: [cgal-discuss] compilation error with jet_smooth_point, Sebastien Loriot (GeometryFactory), 01/22/2014
Archive powered by MHonArc 2.6.18.