Point Cloud Library (PCL)  1.3.1
marching_cubes_greedy_dot.hpp
Go to the documentation of this file.
00001 /*
00002  * Software License Agreement (BSD License)
00003  *
00004  *  Copyright (c) 2010, Willow Garage, Inc.
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions
00009  *  are met:
00010  *
00011  *   * Redistributions of source code must retain the above copyright
00012  *     notice, this list of conditions and the following disclaimer.
00013  *   * Redistributions in binary form must reproduce the above
00014  *     copyright notice, this list of conditions and the following
00015  *     disclaimer in the documentation and/or other materials provided
00016  *     with the distribution.
00017  *   * Neither the name of Willow Garage, Inc. nor the names of its
00018  *     contributors may be used to endorse or promote products derived
00019  *     from this software without specific prior written permission.
00020  *
00021  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00022  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00023  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00024  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00025  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00026  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00027  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00028  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00029  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00030  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00031  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00032  *  POSSIBILITY OF SUCH DAMAGE.
00033  *
00034  */
00035 
00036 #ifndef PCL_SURFACE_IMPL_MARCHING_CUBES_GREEDY_DOT_H_
00037 #define PCL_SURFACE_IMPL_MARCHING_CUBES_GREEDY_DOT_H_
00038 
00039 #include "pcl/surface/marching_cubes_greedy_dot.h"
00041 template <typename PointNT>
00042 pcl::MarchingCubesGreedyDot<PointNT>::MarchingCubesGreedyDot () : dp_threshold_(0)
00043 {}
00044 
00046 template <typename PointNT>
00047 pcl::MarchingCubesGreedyDot<PointNT>::~MarchingCubesGreedyDot ()
00048 {
00049 
00050 }
00051 
00052 template <typename PointNT> void
00053 pcl::MarchingCubesGreedyDot<PointNT>::voxelizeData()
00054 {
00055   for (size_t cp = 0; cp < input_->points.size(); ++cp)
00056   {
00057     // Check if the point is invalid
00058     if (!pcl_isfinite (input_->points[cp].x) ||
00059         !pcl_isfinite (input_->points[cp].y) ||
00060         !pcl_isfinite (input_->points[cp].z))
00061       continue;
00062 
00063     Eigen::Vector3i index_3d;
00064     MarchingCubes<PointNT>::getCellIndex (input_->points[cp].getVector4fMap (), index_3d);
00065     int index_1d = MarchingCubes<PointNT>::getIndexIn1D (index_3d);
00066     Leaf cell_data;
00067     for (int i = 0; i < 8; ++i)
00068     {
00069       cell_data.vertex[i] = 1;
00070     }
00071     cell_hash_map_[index_1d] = cell_data;
00072 
00073     // the vertices are shared by 8 voxels, so we need to update all 8 of them
00074     HashMap neighbor_list;
00075     getNeighborList1D (cell_data, index_3d, neighbor_list);
00076     BOOST_FOREACH (typename HashMap::value_type entry, neighbor_list)
00077     {
00078       Eigen::Vector3i i3d;
00079       getIndexIn3D (entry.first, i3d);
00080       // getCellCenterFromIndex (const Eigen::Vector3i &index, Eigen::Vector4f &center) const
00081       Eigen::Vector4f posVector;
00082       MarchingCubes<PointNT>::getCellCenterFromIndex (i3d, posVector);
00083       posVector = input_->points[cp].getVector4fMap () - posVector;
00084       Eigen::Vector3f posVector3 (posVector[0], posVector[1], posVector[2]);
00085       double dp = posVector3.dot(input_->points[cp].getNormalVector3fMap ());
00086       if (dp < dp_threshold_)
00087         continue;
00088 
00089       // if the neighbor doesn't exist, add it, otherwise we need to do an OR operation on the vertices
00090       if (cell_hash_map_.find (entry.first) == cell_hash_map_.end ())
00091       {
00092         cell_hash_map_[entry.first] = entry.second;
00093       }
00094       else
00095       {
00096         for(int i = 0; i < 8; ++i)
00097         {
00098           if(entry.second.vertex[i] > 0)
00099             cell_hash_map_[entry.first].vertex[i] = entry.second.vertex[i];
00100         }
00101       }
00102     }
00103   }
00104 }
00105 
00106 #define PCL_INSTANTIATE_MarchingCubesGreedyDot(T) template class PCL_EXPORTS pcl::MarchingCubesGreedyDot<T>;
00107 
00108 #endif    // PCL_SURFACE_IMPL_MARCHING_CUBES_GREEDY_DOT_H_
00109 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines