octomap 1.5.0
include/octomap/OcTreeLUT.h
Go to the documentation of this file.
00001 #ifndef OCTOMAP_OCTREE_LUT_H
00002 #define OCTOMAP_OCTREE_LUT_H
00003 
00004 // $Id: OcTreeLUT.h 213 2011-06-16 15:06:53Z kai_wurm $
00005 
00014 /*
00015  * Copyright (c) 2010, Raphael Schmitt, K. M. Wurm, A. Hornung, University of Freiburg
00016  * All rights reserved.
00017  *
00018  * Redistribution and use in source and binary forms, with or without
00019  * modification, are permitted provided that the following conditions are met:
00020  *
00021  *     * Redistributions of source code must retain the above copyright
00022  *       notice, this list of conditions and the following disclaimer.
00023  *     * Redistributions in binary form must reproduce the above copyright
00024  *       notice, this list of conditions and the following disclaimer in the
00025  *       documentation and/or other materials provided with the distribution.
00026  *     * Neither the name of the University of Freiburg nor the names of its
00027  *       contributors may be used to endorse or promote products derived from
00028  *       this software without specific prior written permission.
00029  *
00030  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00031  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00032  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00033  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00034  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00035  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00036  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00037  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00038  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00039  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00040  * POSSIBILITY OF SUCH DAMAGE.
00041  */
00042 
00043 
00044 #include "OcTreeLUTdefs.h"
00045 #include "octomap_types.h"
00046 #include "OcTreeKey.h"
00047 
00048 namespace octomap {
00049 
00050 
00052   struct equal_keys {
00053     bool operator() (const unsigned short int* key1, const unsigned short int* key2) const {
00054       return ((key1[0]==key2[0]) && (key1[1] == key2[1]) && (key1[2] == key2[2]));
00055     }
00056   };
00057 
00058   struct hash_key {
00059     unsigned short int operator()(const unsigned short int* key) const {
00060       return (((31 + key[0]) * 31 + key[1]) * 31 + key[2]);
00061     }
00062   };
00063 
00064 
00065   
00070   class OcTreeLUT {
00071 
00072   public:
00073 
00080     typedef enum {
00081       W = 0, E, N, S , T , B,                         // face neighbors
00082       SW, NW, SE, NE, TW, BW, TE, BE, TN, TS, BN, BS, // edge neighbors
00083       TNW, TSW, TNE, TSE, BNW, BSW, BNE, BSE          // vertex neighbors
00084     } NeighborDirection;
00085 
00086 
00087   public:
00088 
00089     OcTreeLUT(unsigned int _max_depth);
00090     ~OcTreeLUT();
00091     
00092     bool genNeighborKey(const OcTreeKey& node_key, const signed char& dir,
00093                         OcTreeKey& neighbor_key) const;
00094 
00095   protected:
00096 
00097     void initLUT();
00098 
00099     unsigned int genPos(const OcTreeKey& key, const int& i) const;
00100     void changeKey(const int& val, OcTreeKey& key, const unsigned short int& i) const;
00101 
00102   protected:
00103 
00104     unsigned int max_depth;
00105 
00106     signed char nf_values[8][26];
00107     signed char nf_rec_values[8][26];
00108     signed char nf_multiple_values[26][4];
00109   }; 
00110 
00111 } // namespace
00112 
00113 #endif