| 1 | /*
 | 
|---|
| 2 |  * PointCloudAdaptor.hpp
 | 
|---|
| 3 |  *
 | 
|---|
| 4 |  *  Created on: Feb 21, 2011
 | 
|---|
| 5 |  *      Author: heber
 | 
|---|
| 6 |  */
 | 
|---|
| 7 | 
 | 
|---|
| 8 | #ifndef POINTCLOUDADAPTOR_HPP_
 | 
|---|
| 9 | #define POINTCLOUDADAPTOR_HPP_
 | 
|---|
| 10 | 
 | 
|---|
| 11 | // include config.h
 | 
|---|
| 12 | #ifdef HAVE_CONFIG_H
 | 
|---|
| 13 | #include <config.h>
 | 
|---|
| 14 | #endif
 | 
|---|
| 15 | 
 | 
|---|
| 16 | #include "CodePatterns/Assert.hpp"
 | 
|---|
| 17 | #include "IPointCloud.hpp"
 | 
|---|
| 18 | #include "Tesselation/TesselPoint.hpp"
 | 
|---|
| 19 | #include "LinearAlgebra/Vector.hpp"
 | 
|---|
| 20 | 
 | 
|---|
| 21 | /** Adaptor class to IPointCloud, specialized for all needed classes.
 | 
|---|
| 22 |  */
 | 
|---|
| 23 | template <class container_type,
 | 
|---|
| 24 |           class iterator_type = typename container_type::iterator>
 | 
|---|
| 25 | class PointCloudAdaptor: public IPointCloud
 | 
|---|
| 26 | {
 | 
|---|
| 27 | public:
 | 
|---|
| 28 |   PointCloudAdaptor(container_type *_list, const std::string _name) :
 | 
|---|
| 29 |     list(_list),
 | 
|---|
| 30 |     name(_name)
 | 
|---|
| 31 |   {}
 | 
|---|
| 32 |   virtual ~PointCloudAdaptor()
 | 
|---|
| 33 |   {
 | 
|---|
| 34 |     list = NULL;
 | 
|---|
| 35 |   }
 | 
|---|
| 36 | 
 | 
|---|
| 37 |   const std::string& GetName() const
 | 
|---|
| 38 |   {
 | 
|---|
| 39 |     return name;
 | 
|---|
| 40 |   }
 | 
|---|
| 41 |   Vector *GetCenter() const
 | 
|---|
| 42 |   {
 | 
|---|
| 43 |     Vector *Center = new Vector(0., 0., 0.);
 | 
|---|
| 44 |     int num = 0;
 | 
|---|
| 45 |     for (iterator_type iter = iterator_type(list->begin());
 | 
|---|
| 46 |         iter != iterator_type(list->end());
 | 
|---|
| 47 |         ++iter) {
 | 
|---|
| 48 |       (*Center) += ((*iter)->getPosition());
 | 
|---|
| 49 |       num++;
 | 
|---|
| 50 |     }
 | 
|---|
| 51 |     Center->Scale(1. / num);
 | 
|---|
| 52 |     return Center;
 | 
|---|
| 53 |   }
 | 
|---|
| 54 | 
 | 
|---|
| 55 |   TesselPoint *GetPoint()
 | 
|---|
| 56 |   {
 | 
|---|
| 57 |     ASSERT(!IsEnd(), "PointCloudAdaptor<T>::getPoint() - invalid InternalIterator.");
 | 
|---|
| 58 |     return (*InternalIterator)->getTesselPoint();
 | 
|---|
| 59 |   }
 | 
|---|
| 60 |   int GetMaxId() const
 | 
|---|
| 61 |   {
 | 
|---|
| 62 |     int maxid = -1;
 | 
|---|
| 63 |     for (iterator_type iter = iterator_type(list->begin());
 | 
|---|
| 64 |         iter != iterator_type(list->end());
 | 
|---|
| 65 |         ++iter) {
 | 
|---|
| 66 |       if ((maxid == -1) || ((*iter)->getNr() > maxid)) {
 | 
|---|
| 67 |         maxid = (*iter)->getNr();
 | 
|---|
| 68 |       }
 | 
|---|
| 69 |     }
 | 
|---|
| 70 |     return maxid;
 | 
|---|
| 71 |   }
 | 
|---|
| 72 |   void GoToNext()
 | 
|---|
| 73 |   {
 | 
|---|
| 74 |     if (InternalIterator != iterator_type(list->end()))
 | 
|---|
| 75 |       ++InternalIterator;
 | 
|---|
| 76 |   }
 | 
|---|
| 77 |   void GoToFirst()
 | 
|---|
| 78 |   {
 | 
|---|
| 79 |     InternalIterator = iterator_type(list->begin());
 | 
|---|
| 80 |   }
 | 
|---|
| 81 |   bool IsEmpty() const
 | 
|---|
| 82 |   {
 | 
|---|
| 83 |     return list->begin() == list->end();
 | 
|---|
| 84 |   }
 | 
|---|
| 85 |   bool IsEnd() const
 | 
|---|
| 86 |   {
 | 
|---|
| 87 |     return InternalIterator == iterator_type(list->end());
 | 
|---|
| 88 |   }
 | 
|---|
| 89 | 
 | 
|---|
| 90 | private:
 | 
|---|
| 91 |   container_type *list;
 | 
|---|
| 92 |   iterator_type InternalIterator;
 | 
|---|
| 93 |   const std::string name;
 | 
|---|
| 94 | };
 | 
|---|
| 95 | 
 | 
|---|
| 96 | 
 | 
|---|
| 97 | 
 | 
|---|
| 98 | #endif /* POINTCLOUDADAPTOR_HPP_ */
 | 
|---|