octomap 1.5.0
|
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