Point Cloud Library (PCL)
1.7.0
|
00001 /* 00002 * Software License Agreement (BSD License) 00003 * 00004 * Point Cloud Library (PCL) - www.pointclouds.org 00005 * Copyright (c) 2010-2011, Willow Garage, Inc. 00006 * 00007 * All rights reserved. 00008 * 00009 * Redistribution and use in source and binary forms, with or without 00010 * modification, are permitted provided that the following conditions 00011 * are met: 00012 * 00013 * * Redistributions of source code must retain the above copyright 00014 * notice, this list of conditions and the following disclaimer. 00015 * * Redistributions in binary form must reproduce the above 00016 * copyright notice, this list of conditions and the following 00017 * disclaimer in the documentation and/or other materials provided 00018 * with the distribution. 00019 * * Neither the name of the copyright holder(s) nor the names of its 00020 * contributors may be used to endorse or promote products derived 00021 * from this software without specific prior written permission. 00022 * 00023 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00024 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00025 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00026 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00027 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00028 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00029 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00030 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00031 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00032 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00033 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00034 * POSSIBILITY OF SUCH DAMAGE. 00035 * 00036 */ 00037 00038 #ifndef PCL_BOX_CLIPPER3D_H_ 00039 #define PCL_BOX_CLIPPER3D_H_ 00040 #include "clipper3D.h" 00041 00042 namespace pcl 00043 { 00044 /** 00045 * \author Suat Gedikli <gedikli@willowgarage.com> 00046 * \brief Implementation of a box clipper in 3D. Actually it allows affine transformations, thus any parallelepiped in general pose. 00047 * The affine transformation is used to transform the point before clipping it using the unit cube centered at origin and with an extend of -1 to +1 in each dimension 00048 * \ingroup filters 00049 */ 00050 template<typename PointT> 00051 class BoxClipper3D : public Clipper3D<PointT> 00052 { 00053 public: 00054 00055 typedef boost::shared_ptr< BoxClipper3D<PointT> > Ptr; 00056 typedef boost::shared_ptr< const BoxClipper3D<PointT> > ConstPtr; 00057 00058 00059 /** 00060 * \author Suat Gedikli <gedikli@willowgarage.com> 00061 * \brief Constructor taking an affine transformation matrix, which allows also shearing of the clipping area 00062 * \param[in] transformation the 3x3 affine transformation matrix that is used to describe the unit cube 00063 */ 00064 BoxClipper3D (const Eigen::Affine3f& transformation); 00065 00066 /** 00067 * \brief creates a BoxClipper object with a scaled box in general pose 00068 * \param[in] rodrigues the rotation axis and angle given by the vector direction and length respectively 00069 * \param[in] translation the position of the box center 00070 * \param[in] box_size the size of the box for each dimension 00071 */ 00072 BoxClipper3D (const Eigen::Vector3f& rodrigues, const Eigen::Vector3f& translation, const Eigen::Vector3f& box_size); 00073 00074 /** 00075 * \brief Set the affine transformation 00076 * \param[in] transformation 00077 */ 00078 void setTransformation (const Eigen::Affine3f& transformation); 00079 00080 /** 00081 * \brief sets the box in general pose given by the orientation position and size 00082 * \param[in] rodrigues the rotation axis and angle given by the vector direction and length respectively 00083 * \param[in] translation the position of the box center 00084 * \param[in] box_size the size of the box for each dimension 00085 */ 00086 void setTransformation (const Eigen::Vector3f& rodrigues, const Eigen::Vector3f& translation, const Eigen::Vector3f& box_size); 00087 00088 /** 00089 * \brief virtual destructor 00090 */ 00091 virtual ~BoxClipper3D () throw (); 00092 00093 virtual bool 00094 clipPoint3D (const PointT& point) const; 00095 00096 virtual bool 00097 clipLineSegment3D (PointT& from, PointT& to) const; 00098 00099 virtual void 00100 clipPlanarPolygon3D (std::vector<PointT>& polygon) const; 00101 00102 virtual void 00103 clipPlanarPolygon3D (const std::vector<PointT>& polygon, std::vector<PointT>& clipped_polygon) const; 00104 00105 virtual void 00106 clipPointCloud3D (const pcl::PointCloud<PointT> &cloud_in, std::vector<int>& clipped, const std::vector<int>& indices = std::vector<int> ()) const; 00107 00108 virtual Clipper3D<PointT>* 00109 clone () const; 00110 00111 protected: 00112 float getDistance (const PointT& point) const; 00113 void transformPoint (const PointT& pointIn, PointT& pointOut) const; 00114 private: 00115 /** 00116 * \brief the affine transformation that is applied before clipping is done on the unit cube. 00117 */ 00118 Eigen::Affine3f transformation_; 00119 00120 public: 00121 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 00122 }; 00123 } 00124 00125 #ifdef PCL_NO_PRECOMPILE 00126 #include <pcl/filters/impl/box_clipper3D.hpp> 00127 #endif 00128 00129 #endif // PCL_BOX_CLIPPER3D_H_