Point Cloud Library (PCL)  1.5.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
marching_cubes_greedy.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_H_
00037 #define PCL_SURFACE_IMPL_MARCHING_CUBES_GREEDY_H_
00038 
00039 #include "pcl/surface/marching_cubes_greedy.h"
00041 template <typename PointNT>
00042 pcl::MarchingCubesGreedy<PointNT>::MarchingCubesGreedy ()
00043 {
00044 }
00045 
00047 template <typename PointNT>
00048 pcl::MarchingCubesGreedy<PointNT>::~MarchingCubesGreedy ()
00049 {
00050 }
00051 
00052 template <typename PointNT> void
00053 pcl::MarchingCubesGreedy<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     uint64_t index_1d = MarchingCubes<PointNT>::getIndexIn1D (index_3d);
00066     Leaf cell_data;
00067     for (int i = 0; i < 8; ++i)
00068       cell_data.vertex[i] = 1;
00069 
00070     cell_hash_map_[index_1d] = cell_data;
00071 
00072     // the vertices are shared by 8 voxels, so we need to update all 8 of them
00073     HashMap neighbor_list;
00074     this->getNeighborList1D (cell_data, index_3d, neighbor_list);
00075     BOOST_FOREACH (typename HashMap::value_type entry, neighbor_list)
00076     {
00077       Eigen::Vector3i i3d;
00078       this->getIndexIn3D(entry.first, i3d);
00079       // if the neighbor doesn't exist, add it, otherwise we need to do an OR operation on the vertices
00080       if (cell_hash_map_.find (entry.first) == cell_hash_map_.end ())
00081       {
00082         cell_hash_map_[entry.first] = entry.second;
00083       }
00084       else
00085       {
00086         for (int i = 0; i < 8; ++i)
00087         {
00088           if (entry.second.vertex[i] > 0)
00089             cell_hash_map_[entry.first].vertex[i] = entry.second.vertex[i];
00090         }
00091       }
00092     }
00093   }
00094 }
00095 
00096 #define PCL_INSTANTIATE_MarchingCubesGreedy(T) template class PCL_EXPORTS pcl::MarchingCubesGreedy<T>;
00097 
00098 #endif    // PCL_SURFACE_IMPL_MARCHING_CUBES_GREEDY_H_
00099