558 lines
14 KiB
C++
558 lines
14 KiB
C++
/*
|
|
* Software License Agreement (BSD License)
|
|
*
|
|
* Point Cloud Library (PCL) - www.pointclouds.org
|
|
* Copyright (c) 2012-, Open Perception, Inc.
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials provided
|
|
* with the distribution.
|
|
* * Neither the name of the copyright holder(s) nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*
|
|
*/
|
|
|
|
#ifndef PCL_POINT_CLOUD_ITERATOR_HPP_
|
|
#define PCL_POINT_CLOUD_ITERATOR_HPP_
|
|
|
|
#include <pcl/cloud_iterator.h>
|
|
|
|
namespace pcl
|
|
{
|
|
/** \brief
|
|
* \author Suat Gedikli
|
|
*/
|
|
template <class PointT>
|
|
class DefaultIterator : public CloudIterator<PointT>::Iterator
|
|
{
|
|
public:
|
|
DefaultIterator (PointCloud<PointT>& cloud)
|
|
: cloud_ (cloud)
|
|
, iterator_ (cloud.begin ())
|
|
{
|
|
}
|
|
|
|
~DefaultIterator ()
|
|
{
|
|
}
|
|
|
|
void operator ++ ()
|
|
{
|
|
++iterator_;
|
|
}
|
|
|
|
void operator ++ (int)
|
|
{
|
|
iterator_++;
|
|
}
|
|
|
|
PointT& operator* () const
|
|
{
|
|
return (*iterator_);
|
|
}
|
|
|
|
PointT* operator-> ()
|
|
{
|
|
return (&(*iterator_));
|
|
}
|
|
|
|
unsigned getCurrentPointIndex () const
|
|
{
|
|
return (iterator_ - cloud_.begin ());
|
|
}
|
|
|
|
unsigned getCurrentIndex () const
|
|
{
|
|
return (iterator_ - cloud_.begin ());
|
|
}
|
|
|
|
std::size_t size () const
|
|
{
|
|
return cloud_.size ();
|
|
}
|
|
|
|
void reset ()
|
|
{
|
|
iterator_ = cloud_.begin ();
|
|
}
|
|
|
|
bool isValid () const
|
|
{
|
|
return (iterator_ != cloud_.end ());
|
|
}
|
|
private:
|
|
PointCloud<PointT>& cloud_;
|
|
typename PointCloud<PointT>::iterator iterator_;
|
|
};
|
|
|
|
/** \brief
|
|
* \author Suat Gedikli
|
|
*/
|
|
template <class PointT>
|
|
class IteratorIdx : public CloudIterator<PointT>::Iterator
|
|
{
|
|
public:
|
|
IteratorIdx (PointCloud<PointT>& cloud, const Indices& indices)
|
|
: cloud_ (cloud)
|
|
, indices_ (indices)
|
|
, iterator_ (indices_.begin ())
|
|
{
|
|
}
|
|
|
|
IteratorIdx (PointCloud<PointT>& cloud, const PointIndices& indices)
|
|
: cloud_ (cloud)
|
|
, indices_ (indices.indices)
|
|
, iterator_ (indices_.begin ())
|
|
{
|
|
}
|
|
|
|
virtual ~IteratorIdx () {}
|
|
|
|
void operator ++ ()
|
|
{
|
|
++iterator_;
|
|
}
|
|
|
|
void operator ++ (int)
|
|
{
|
|
iterator_++;
|
|
}
|
|
|
|
PointT& operator* () const
|
|
{
|
|
return (cloud_.points [*iterator_]);
|
|
}
|
|
|
|
PointT* operator-> ()
|
|
{
|
|
return (&(cloud_.points [*iterator_]));
|
|
}
|
|
|
|
unsigned getCurrentPointIndex () const
|
|
{
|
|
return (*iterator_);
|
|
}
|
|
|
|
unsigned getCurrentIndex () const
|
|
{
|
|
return (iterator_ - indices_.begin ());
|
|
}
|
|
|
|
std::size_t size () const
|
|
{
|
|
return indices_.size ();
|
|
}
|
|
|
|
void reset ()
|
|
{
|
|
iterator_ = indices_.begin ();
|
|
}
|
|
|
|
bool isValid () const
|
|
{
|
|
return (iterator_ != indices_.end ());
|
|
}
|
|
|
|
private:
|
|
PointCloud<PointT>& cloud_;
|
|
Indices indices_;
|
|
Indices::iterator iterator_;
|
|
};
|
|
|
|
/** \brief
|
|
* \author Suat Gedikli
|
|
*/
|
|
template <class PointT>
|
|
class ConstCloudIterator<PointT>::DefaultConstIterator : public ConstCloudIterator<PointT>::Iterator
|
|
{
|
|
public:
|
|
DefaultConstIterator (const PointCloud<PointT>& cloud)
|
|
: cloud_ (cloud)
|
|
, iterator_ (cloud.begin ())
|
|
{
|
|
}
|
|
|
|
~DefaultConstIterator ()
|
|
{
|
|
}
|
|
|
|
void operator ++ () override
|
|
{
|
|
++iterator_;
|
|
}
|
|
|
|
void operator ++ (int) override
|
|
{
|
|
iterator_++;
|
|
}
|
|
|
|
const PointT& operator* () const override
|
|
{
|
|
return (*iterator_);
|
|
}
|
|
|
|
const PointT* operator-> () const override
|
|
{
|
|
return (&(*iterator_));
|
|
}
|
|
|
|
unsigned getCurrentPointIndex () const override
|
|
{
|
|
return (unsigned (iterator_ - cloud_.begin ()));
|
|
}
|
|
|
|
unsigned getCurrentIndex () const override
|
|
{
|
|
return (unsigned (iterator_ - cloud_.begin ()));
|
|
}
|
|
|
|
std::size_t size () const override
|
|
{
|
|
return cloud_.size ();
|
|
}
|
|
|
|
void reset () override
|
|
{
|
|
iterator_ = cloud_.begin ();
|
|
}
|
|
|
|
bool isValid () const override
|
|
{
|
|
return (iterator_ != cloud_.end ());
|
|
}
|
|
private:
|
|
const PointCloud<PointT>& cloud_;
|
|
typename PointCloud<PointT>::const_iterator iterator_;
|
|
};
|
|
|
|
/** \brief
|
|
* \author Suat Gedikli
|
|
*/
|
|
template <class PointT>
|
|
class ConstCloudIterator<PointT>::ConstIteratorIdx : public ConstCloudIterator<PointT>::Iterator
|
|
{
|
|
public:
|
|
ConstIteratorIdx (const PointCloud<PointT>& cloud,
|
|
const Indices& indices)
|
|
: cloud_ (cloud)
|
|
, indices_ (indices)
|
|
, iterator_ (indices_.begin ())
|
|
{
|
|
}
|
|
|
|
ConstIteratorIdx (const PointCloud<PointT>& cloud,
|
|
const PointIndices& indices)
|
|
: cloud_ (cloud)
|
|
, indices_ (indices.indices)
|
|
, iterator_ (indices_.begin ())
|
|
{
|
|
}
|
|
|
|
~ConstIteratorIdx () {}
|
|
|
|
void operator ++ () override
|
|
{
|
|
++iterator_;
|
|
}
|
|
|
|
void operator ++ (int) override
|
|
{
|
|
iterator_++;
|
|
}
|
|
|
|
const PointT& operator* () const override
|
|
{
|
|
return (cloud_[*iterator_]);
|
|
}
|
|
|
|
const PointT* operator-> () const override
|
|
{
|
|
return (&(cloud_.points [*iterator_]));
|
|
}
|
|
|
|
unsigned getCurrentPointIndex () const override
|
|
{
|
|
return (unsigned (*iterator_));
|
|
}
|
|
|
|
unsigned getCurrentIndex () const override
|
|
{
|
|
return (unsigned (iterator_ - indices_.begin ()));
|
|
}
|
|
|
|
std::size_t size () const override
|
|
{
|
|
return indices_.size ();
|
|
}
|
|
|
|
void reset () override
|
|
{
|
|
iterator_ = indices_.begin ();
|
|
}
|
|
|
|
bool isValid () const override
|
|
{
|
|
return (iterator_ != indices_.end ());
|
|
}
|
|
|
|
private:
|
|
const PointCloud<PointT>& cloud_;
|
|
Indices indices_;
|
|
Indices::iterator iterator_;
|
|
};
|
|
} // namespace pcl
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::CloudIterator<PointT>::CloudIterator (PointCloud<PointT>& cloud)
|
|
: iterator_ (new DefaultIterator<PointT> (cloud))
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::CloudIterator<PointT>::CloudIterator (
|
|
PointCloud<PointT>& cloud, const Indices& indices)
|
|
: iterator_ (new IteratorIdx<PointT> (cloud, indices))
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::CloudIterator<PointT>::CloudIterator (
|
|
PointCloud<PointT>& cloud, const PointIndices& indices)
|
|
: iterator_ (new IteratorIdx<PointT> (cloud, indices))
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::CloudIterator<PointT>::CloudIterator (
|
|
PointCloud<PointT>& cloud, const Correspondences& corrs, bool source)
|
|
{
|
|
Indices indices;
|
|
indices.reserve (corrs.size ());
|
|
if (source)
|
|
{
|
|
for (const auto &corr : corrs)
|
|
indices.push_back (corr.index_query);
|
|
}
|
|
else
|
|
{
|
|
for (const auto &corr : corrs)
|
|
indices.push_back (corr.index_match);
|
|
}
|
|
iterator_ = new IteratorIdx<PointT> (cloud, indices);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::CloudIterator<PointT>::~CloudIterator ()
|
|
{
|
|
delete iterator_;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> void
|
|
pcl::CloudIterator<PointT>::operator ++ ()
|
|
{
|
|
iterator_->operator++ ();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> void
|
|
pcl::CloudIterator<PointT>::operator ++ (int)
|
|
{
|
|
iterator_->operator++ (0);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> PointT&
|
|
pcl::CloudIterator<PointT>::operator* () const
|
|
{
|
|
return (iterator_->operator * ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> PointT*
|
|
pcl::CloudIterator<PointT>::operator-> () const
|
|
{
|
|
return (iterator_->operator-> ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> unsigned
|
|
pcl::CloudIterator<PointT>::getCurrentPointIndex () const
|
|
{
|
|
return (iterator_->getCurrentPointIndex ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> unsigned
|
|
pcl::CloudIterator<PointT>::getCurrentIndex () const
|
|
{
|
|
return (iterator_->getCurrentIndex ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> std::size_t
|
|
pcl::CloudIterator<PointT>::size () const
|
|
{
|
|
return (iterator_->size ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> void
|
|
pcl::CloudIterator<PointT>::reset ()
|
|
{
|
|
iterator_->reset ();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> bool
|
|
pcl::CloudIterator<PointT>::isValid () const
|
|
{
|
|
return (iterator_->isValid ());
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::ConstCloudIterator<PointT>::ConstCloudIterator (const PointCloud<PointT>& cloud)
|
|
: iterator_ (new typename pcl::ConstCloudIterator<PointT>::DefaultConstIterator (cloud))
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::ConstCloudIterator<PointT>::ConstCloudIterator (
|
|
const PointCloud<PointT>& cloud, const Indices& indices)
|
|
: iterator_ (new typename pcl::ConstCloudIterator<PointT>::ConstIteratorIdx (cloud, indices))
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::ConstCloudIterator<PointT>::ConstCloudIterator (
|
|
const PointCloud<PointT>& cloud, const PointIndices& indices)
|
|
: iterator_ (new typename pcl::ConstCloudIterator<PointT>::ConstIteratorIdx (cloud, indices))
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::ConstCloudIterator<PointT>::ConstCloudIterator (
|
|
const PointCloud<PointT>& cloud, const Correspondences& corrs, bool source)
|
|
{
|
|
Indices indices;
|
|
indices.reserve (corrs.size ());
|
|
if (source)
|
|
{
|
|
for (const auto &corr : corrs)
|
|
indices.push_back (corr.index_query);
|
|
}
|
|
else
|
|
{
|
|
for (const auto &corr : corrs)
|
|
indices.push_back (corr.index_match);
|
|
}
|
|
iterator_ = new typename pcl::ConstCloudIterator<PointT>::ConstIteratorIdx (cloud, indices);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT>
|
|
pcl::ConstCloudIterator<PointT>::~ConstCloudIterator ()
|
|
{
|
|
delete iterator_;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> void
|
|
pcl::ConstCloudIterator<PointT>::operator ++ ()
|
|
{
|
|
iterator_->operator++ ();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> void
|
|
pcl::ConstCloudIterator<PointT>::operator ++ (int)
|
|
{
|
|
iterator_->operator++ (0);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> const PointT&
|
|
pcl::ConstCloudIterator<PointT>::operator* () const
|
|
{
|
|
return (iterator_->operator * ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> const PointT*
|
|
pcl::ConstCloudIterator<PointT>::operator-> () const
|
|
{
|
|
return (iterator_->operator-> ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> unsigned
|
|
pcl::ConstCloudIterator<PointT>::getCurrentPointIndex () const
|
|
{
|
|
return (iterator_->getCurrentPointIndex ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> unsigned
|
|
pcl::ConstCloudIterator<PointT>::getCurrentIndex () const
|
|
{
|
|
return (iterator_->getCurrentIndex ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> std::size_t
|
|
pcl::ConstCloudIterator<PointT>::size () const
|
|
{
|
|
return (iterator_->size ());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> void
|
|
pcl::ConstCloudIterator<PointT>::reset ()
|
|
{
|
|
iterator_->reset ();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
template <class PointT> bool
|
|
pcl::ConstCloudIterator<PointT>::isValid () const
|
|
{
|
|
return (iterator_->isValid ());
|
|
}
|
|
|
|
#endif // PCL_POINT_CLOUD_ITERATOR_HPP_
|
|
|