| [34c43a] | 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 "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:
 | 
|---|
| [caa06ef] | 28 |   PointCloudAdaptor(container_type *_list, const std::string _name) :
 | 
|---|
 | 29 |     list(_list),
 | 
|---|
 | 30 |     name(_name)
 | 
|---|
| [34c43a] | 31 |   {}
 | 
|---|
 | 32 |   virtual ~PointCloudAdaptor()
 | 
|---|
 | 33 |   {
 | 
|---|
 | 34 |     list = NULL;
 | 
|---|
 | 35 |   }
 | 
|---|
 | 36 | 
 | 
|---|
| [caa06ef] | 37 |   const std::string& GetName() const
 | 
|---|
| [34c43a] | 38 |   {
 | 
|---|
| [caa06ef] | 39 |     return name;
 | 
|---|
| [34c43a] | 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;
 | 
|---|
| [caa06ef] | 93 |   const std::string name;
 | 
|---|
| [34c43a] | 94 | };
 | 
|---|
 | 95 | 
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 | 
 | 
|---|
 | 98 | #endif /* POINTCLOUDADAPTOR_HPP_ */
 | 
|---|