the order of the pts in the kd-tree is shuffled -> Internally store the input pts

This does not change the memory pick, since the points are anyway duplicated
  while advancing the scale space
This commit is contained in:
Sébastien Loriot 2015-01-20 10:27:15 +01:00
parent f97bd9fb33
commit f162da1a7c
2 changed files with 13 additions and 13 deletions

View File

@ -393,7 +393,6 @@ Scale_space_surface_reconstruction_3<Gt,FS,Sh,wA,Ct>::
increase_scale( unsigned int iterations ) { increase_scale( unsigned int iterations ) {
typedef std::vector< unsigned int > CountVec; typedef std::vector< unsigned int > CountVec;
typedef std::map<Point, std::size_t> PIMap; typedef std::map<Point, std::size_t> PIMap;
typedef std::vector<Point> Pointset;
// This method must be called after filling the point collection. // This method must be called after filling the point collection.
if( iterations == 0 || _tree.empty() ) return; if( iterations == 0 || _tree.empty() ) return;
@ -401,10 +400,6 @@ increase_scale( unsigned int iterations ) {
if( !has_neighborhood_squared_radius() ) if( !has_neighborhood_squared_radius() )
estimate_neighborhood_squared_radius(); estimate_neighborhood_squared_radius();
// To enable concurrent processing, we maintain two data structures:
// a search tree and a vector for the points after smoothing.
Pointset points;
points.assign( _tree.begin(), _tree.end() );
for( unsigned int iter = 0; iter < iterations; ++iter ) { for( unsigned int iter = 0; iter < iterations; ++iter ) {
if( !_tree.is_built() ) if( !_tree.is_built() )
@ -413,21 +408,21 @@ increase_scale( unsigned int iterations ) {
// Collect the number of neighbors of each point. // Collect the number of neighbors of each point.
// This can be done concurrently. // This can be done concurrently.
CountVec neighbors( _tree.size(), 0 ); CountVec neighbors( _tree.size(), 0 );
try_parallel( ComputeNN( points, _tree, _squared_radius, neighbors ), 0, _tree.size() ); try_parallel( ComputeNN( _points, _tree, _squared_radius, neighbors ), 0, _tree.size() );
// Construct a mapping from each point to its index. // Construct a mapping from each point to its index.
PIMap indices; PIMap indices;
std::size_t index = 0; std::size_t index = 0;
for( typename Pointset::const_iterator pit = points.begin(); pit != points.end(); ++pit, ++index) for( typename Pointset::const_iterator pit = _points.begin(); pit != _points.end(); ++pit, ++index)
indices[ *pit ] = index; indices[ *pit ] = index;
// Compute the tranformed point locations. // Compute the tranformed point locations.
// This can be done concurrently. // This can be done concurrently.
try_parallel( AdvanceSS( _tree, neighbors, indices, points ), 0, _tree.size() ); try_parallel( AdvanceSS( _tree, neighbors, indices, _points ), 0, _tree.size() );
// Put the new points back in the tree. // Put the new points back in the tree.
_tree.clear(); _tree.clear();
_tree.insert( points.begin(), points.end() ); _tree.insert( _points.begin(), _points.end() );
} }
} }

View File

@ -201,6 +201,9 @@ private:
// The shells can be accessed through iterators to the surface. // The shells can be accessed through iterators to the surface.
TripleIterSet _shells; TripleIterSet _shells;
typedef std::vector<Point> Pointset;
Pointset _points;
public: public:
/// \name Constructors /// \name Constructors
/// \{ /// \{
@ -292,6 +295,7 @@ public:
typename boost::enable_if< CGAL::is_iterator<InputIterator> >::type* = NULL ) { typename boost::enable_if< CGAL::is_iterator<InputIterator> >::type* = NULL ) {
#endif // DOXYGEN_RUNNING #endif // DOXYGEN_RUNNING
_tree.insert( begin, end ); _tree.insert( begin, end );
_points.insert(_points.end(), begin, end);
} }
/// inserts a point into the scale-space at the current scale. /// inserts a point into the scale-space at the current scale.
@ -310,6 +314,7 @@ public:
*/ */
void insert( const Point& p ) { void insert( const Point& p ) {
_tree.insert( p ); _tree.insert( p );
_points.push_back(p);
} }
/// clears the stored scale-space surface reconstruction data. /// clears the stored scale-space surface reconstruction data.
@ -803,20 +808,20 @@ public:
/// \name Iterators /// \name Iterators
/// \{ /// \{
/// gives an iterator to the first point at the current scale. /// gives an iterator to the first point at the current scale.
Point_const_iterator points_begin() const { return _tree.begin(); } Point_const_iterator points_begin() const { return _points.begin(); }
/// gives an iterator to the first point at the current scale. /// gives an iterator to the first point at the current scale.
/** \warning Changes to the scale-space do not cause an automatic update to /** \warning Changes to the scale-space do not cause an automatic update to
* the surface. * the surface.
*/ */
Point_iterator points_begin() { return _tree.begin(); } Point_iterator points_begin() { return _points.begin(); }
/// gives a past-the-end iterator of the points at the current scale. /// gives a past-the-end iterator of the points at the current scale.
Point_const_iterator points_end() const { return _tree.end(); } Point_const_iterator points_end() const { return _points.end(); }
/// gives a past-the-end iterator of the points at the current scale. /// gives a past-the-end iterator of the points at the current scale.
/** \warning Changes to the scale-space do not cause an automatic update to /** \warning Changes to the scale-space do not cause an automatic update to
* the surface. * the surface.
*/ */
Point_iterator points_end() { return _tree.end(); } Point_iterator points_end() { return _points.end(); }
/// gives an iterator to the first triple in the surface. /// gives an iterator to the first triple in the surface.
Triple_const_iterator surface_begin() const { return _surface.begin(); } Triple_const_iterator surface_begin() const { return _surface.begin(); }