2012-09-16 12:33:11 +00:00
|
|
|
/** @file
|
|
|
|
* @brief Representation of the optimized k-d tree. MetaScan variant.
|
|
|
|
* @author Andreas Nuechter. Institute of Computer Science, University of Osnabrueck, Germany.
|
|
|
|
* @author Kai Lingemann. Institute of Computer Science, University of Osnabrueck, Germany.
|
|
|
|
* @author Thomas Escher
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __KD_META_H__
|
|
|
|
#define __KD_META_H__
|
|
|
|
|
|
|
|
#include "kdparams.h"
|
|
|
|
#include "searchTree.h"
|
|
|
|
#include "data_types.h"
|
2012-10-24 09:22:27 +00:00
|
|
|
#include "kdTreeImpl.h"
|
2012-09-16 12:33:11 +00:00
|
|
|
|
|
|
|
#include <boost/thread/mutex.hpp>
|
|
|
|
#include <boost/thread/locks.hpp>
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#if !defined _OPENMP && defined OPENMP
|
|
|
|
#define _OPENMP
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef _OPENMP
|
|
|
|
#include <omp.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Scan;
|
|
|
|
|
|
|
|
|
2012-10-24 09:22:27 +00:00
|
|
|
struct Index {
|
|
|
|
unsigned int s, i;
|
|
|
|
inline void set(unsigned int _s, unsigned int _i) { s = _s; i = _i; }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct IndexAccessor {
|
|
|
|
inline double* operator() (const DataXYZ* const* pts, const Index& i) const {
|
|
|
|
return (*pts[i.s])[i.i];
|
|
|
|
}
|
|
|
|
};
|
2012-09-16 12:33:11 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief The optimized k-d tree.
|
|
|
|
*
|
|
|
|
* A kD tree for points, with limited
|
|
|
|
* capabilities (find nearest point to
|
|
|
|
* a given point, or to a ray).
|
|
|
|
**/
|
2012-10-24 09:22:27 +00:00
|
|
|
class KDtreeMetaManaged :
|
|
|
|
public SearchTree,
|
|
|
|
private KDTreeImpl<const DataXYZ* const*, Index, IndexAccessor>
|
|
|
|
{
|
2012-09-16 12:33:11 +00:00
|
|
|
public:
|
|
|
|
KDtreeMetaManaged(const vector<Scan*>& scans);
|
|
|
|
virtual ~KDtreeMetaManaged();
|
|
|
|
|
|
|
|
virtual void lock();
|
|
|
|
virtual void unlock();
|
|
|
|
|
|
|
|
//! Aquires cached data first to pass on to the usual KDtree to process
|
|
|
|
virtual double* FindClosest(double *_p, double maxdist2, int threadNum = 0) const;
|
|
|
|
private:
|
|
|
|
Scan** m_scans;
|
|
|
|
DataXYZ** m_data;
|
|
|
|
unsigned int m_size;
|
|
|
|
|
|
|
|
//! Mutex for safely reducing points just once in a multithreaded environment
|
|
|
|
boost::mutex m_mutex_locking;
|
|
|
|
volatile unsigned int m_count_locking;
|
|
|
|
|
|
|
|
// constructor initializer list hacks
|
|
|
|
Index* m_temp_indices;
|
|
|
|
Index* prepareTempIndices(const vector<Scan*>& scans);
|
|
|
|
unsigned int getPointsSize(const vector<Scan*>& scans);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|