[ VIGRA Homepage | Function Index | Class Index | Namespaces | File List | Main Page ]
00001 /************************************************************************/ 00002 /* */ 00003 /* Copyright 2006-2007 by F. Heinrich, B. Seppke, Ullrich Koethe */ 00004 /* Cognitive Systems Group, University of Hamburg, Germany */ 00005 /* */ 00006 /* This file is part of the VIGRA computer vision library. */ 00007 /* ( Version 1.6.0, Aug 13 2008 ) */ 00008 /* The VIGRA Website is */ 00009 /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ 00010 /* Please direct questions, bug reports, and contributions to */ 00011 /* ullrich.koethe@iwr.uni-heidelberg.de or */ 00012 /* vigra@informatik.uni-hamburg.de */ 00013 /* */ 00014 /* Permission is hereby granted, free of charge, to any person */ 00015 /* obtaining a copy of this software and associated documentation */ 00016 /* files (the "Software"), to deal in the Software without */ 00017 /* restriction, including without limitation the rights to use, */ 00018 /* copy, modify, merge, publish, distribute, sublicense, and/or */ 00019 /* sell copies of the Software, and to permit persons to whom the */ 00020 /* Software is furnished to do so, subject to the following */ 00021 /* conditions: */ 00022 /* */ 00023 /* The above copyright notice and this permission notice shall be */ 00024 /* included in all copies or substantial portions of the */ 00025 /* Software. */ 00026 /* */ 00027 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ 00028 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ 00029 /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ 00030 /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ 00031 /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ 00032 /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ 00033 /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ 00034 /* OTHER DEALINGS IN THE SOFTWARE. */ 00035 /* */ 00036 /************************************************************************/ 00037 00038 #ifndef VIGRA_VOXELNEIGHBORHOOD_HXX 00039 #define VIGRA_VOXELNEIGHBORHOOD_HXX 00040 00041 #include "tinyvector.hxx" 00042 #include "pixelneighborhood.hxx" 00043 00044 namespace vigra { 00045 00046 /** \addtogroup VoxelNeighborhood Utilities to manage voxel neighborhoods 00047 00048 6- and 26-neighborhood definitions and circulators. 00049 00050 <b>\#include</b> <<a href="voxelneighborhood_8hxx-source.html">vigra/voxelneighborhood.hxx</a>><br> 00051 00052 <b>See also:</b> \ref vigra::NeighborhoodCirculator 00053 */ 00054 //@{ 00055 00056 /// 3-dimensional difference vector 00057 typedef vigra::TinyVector<int, 3> Diff3D; 00058 00059 /********************************************************/ 00060 /* */ 00061 /* AtVolumeBorder */ 00062 /* */ 00063 /********************************************************/ 00064 00065 /** \brief Encode whether a voxel is near the volume border. 00066 00067 // This enum is used with \ref isAtVolumeBorder() and 00068 // \ref vigra::RestrictedNeighborhoodCirculator. 00069 00070 //<b>\#include</b> <<a href="voxelneighborhood_8hxx-source.html">vigra/voxelneighborhood.hxx</a>><br> 00071 //Namespace: vigra 00072 */ 00073 00074 typedef AtImageBorder AtVolumeBorder; 00075 00076 00077 /** \brief Find out whether a voxel is at the volume border. 00078 00079 This function checks if \a x == 0 or \a x == \a width - 1 and 00080 \a y == 0 or \a y == \a height - 1 and so on and returns the appropriate value 00081 of \ref vigra::AtVolumeBorder, or zero when the voxel is not at te volume border. 00082 The behavior of the function is undefined if (x,y,z) is not inside the volume. 00083 */ 00084 inline AtVolumeBorder isAtVolumeBorder(int x, int y, int z, int width, int height, int depth) 00085 { 00086 return static_cast<AtVolumeBorder>((x == 0 00087 ? LeftBorder 00088 : x == width-1 00089 ? RightBorder 00090 : NotAtBorder) | 00091 (y == 0 00092 ? TopBorder 00093 : y == height-1 00094 ? BottomBorder 00095 : NotAtBorder) | 00096 (z == 0 00097 ? FrontBorder 00098 : z == depth-1 00099 ? RearBorder 00100 : NotAtBorder)); 00101 }; 00102 /** \brief Find out whether a voxel is at a scan-order relevant volume border. 00103 This function checks if \a x == 0 or \a y == 0 or \a z == \a 0 and returns the 00104 appropriate value of \ref vigra::AtVolumeBorder, or zero when the voxel is 00105 not at te volume border. 00106 The behavior of the function is undefined if (x,y,z) is not inside the volume. 00107 */ 00108 inline AtVolumeBorder isAtVolumeBorderCausal(int x, int y, int z, int width, int height, int depth) 00109 { 00110 return static_cast<AtVolumeBorder>((x == 0 00111 ? LeftBorder 00112 : NotAtBorder) | 00113 (y == 0 00114 ? TopBorder 00115 : NotAtBorder) | 00116 (z == 0 00117 ? FrontBorder 00118 : NotAtBorder)); 00119 }; 00120 /** TODO: Write new comment \brief Find out whether a voxel is at a scan-order relevant volume border. 00121 This function checks if \a x == 0 or \a y == 0 or \a z == \a 0 and returns the 00122 appropriate value of \ref vigra::AtVolumeBorder, or zero when the voxel is 00123 not at te volume border. 00124 The behavior of the function is undefined if (x,y,z) is not inside the volume. 00125 */ 00126 inline AtVolumeBorder isAtVolumeBorderAntiCausal(int x, int y, int z, int width, int height, int depth) 00127 { 00128 return static_cast<AtVolumeBorder>((x == width-1 00129 ? RightBorder 00130 : NotAtBorder) | 00131 (y == height-1 00132 ? BottomBorder 00133 : NotAtBorder) | 00134 (z == depth-1 00135 ? RearBorder 00136 : NotAtBorder)); 00137 }; 00138 00139 /********************************************************/ 00140 /* */ 00141 /* Neighborhood3DSix */ 00142 /* */ 00143 /********************************************************/ 00144 00145 /** 3D 6-Neighborhood. */ 00146 namespace Neighborhood3DSix 00147 { 00148 00149 /** \brief Encapsulation of direction management of neighbors for a 3D 6-neighborhood. 00150 */ 00151 class NeighborCode3D 00152 { 00153 public: 00154 00155 typedef Diff3D difference_type; 00156 00157 /** provides enumeration of all directions. 00158 DirectionCount may be used for portable loop termination conditions. 00159 */ 00160 enum Direction { 00161 Error = -1, 00162 InFront= 0, 00163 North, 00164 West , 00165 Behind, 00166 South, 00167 East, 00168 DirectionCount, 00169 CausalFirst = InFront, 00170 CausalLast = West, 00171 AntiCausalFirst = Behind, 00172 AntiCausalLast = East, 00173 00174 InitialDirection = InFront, 00175 OppositeDirPrefix = 1, 00176 OppositeOffset = 3 00177 }; 00178 00179 static unsigned int directionBit(Direction d) 00180 { 00181 static unsigned int b[] = { 1 << (InFront + 1), 00182 1 << (North + 1), 00183 1 << (West + 1), 00184 1 << (Behind + 1), 00185 1 << (South + 1), 00186 1 << (East + 1) 00187 }; 00188 return b[d]; 00189 }; 00190 00191 00192 /** The number of valid neighbors if the current center is at the volume border. 00193 */ 00194 static unsigned int nearBorderDirectionCount(AtVolumeBorder b) 00195 { 00196 static unsigned int c[] = { 6, 5, 5, 0, 5, 4, 4, 0, 5, 4, 00197 4, 0, 0, 0, 0, 0, 5, 4, 4, 0, 00198 4, 3, 3, 0, 4, 3, 3, 0, 0, 0, 00199 0, 0, 5, 4, 4, 0, 4, 3, 3, 0, 00200 4, 3, 3}; 00201 return c[b]; 00202 } 00203 00204 /** The valid direction codes when the center is at the volume border. 00205 \a index must be in the range <tt>0...nearBorderDirectionCount(b)-1</tt>. 00206 */ 00207 static Direction nearBorderDirections(AtVolumeBorder b, int index) 00208 { 00209 static Direction c[43][6] = { 00210 { InFront, North, West, Behind, South, East}, // 0 - NotAtBorder 00211 { InFront, North, West, Behind, South, Error}, // 1 - AtRightBorder 00212 { InFront, North, Behind, South, East, Error}, // 2 - AtLeftBorder 00213 { Error, Error, Error, Error, Error, Error}, 00214 { InFront, West, Behind, South, East, Error}, // 4 - AtTopBorder 00215 { InFront, West, Behind, South, Error, Error}, // 5 - AtTopRightBorder 00216 { InFront, Behind, South, East, Error, Error}, // 6 - AtTopLeftBorder 00217 { Error, Error, Error, Error, Error, Error}, 00218 { InFront, North, West, Behind, East, Error}, // 8 - AtBottomBorder 00219 { InFront, North, West, Behind, Error, Error}, // 9 - AtBottomRightBorder 00220 { InFront, North, Behind, East, Error, Error}, //10- AtBottomLeftBorder 00221 { Error, Error, Error, Error, Error, Error}, 00222 { Error, Error, Error, Error, Error, Error}, 00223 { Error, Error, Error, Error, Error, Error}, 00224 { Error, Error, Error, Error, Error, Error}, 00225 { Error, Error, Error, Error, Error, Error}, 00226 { North, West, Behind, South, East, Error}, //16 - AtFrontBorder 00227 { North, West, Behind, South, Error, Error}, //17 - AtFrontRightBorder 00228 { North, Behind, South, East, Error, Error}, //18 - AtFrontLeftBorder 00229 { Error, Error, Error, Error, Error, Error}, 00230 { West, Behind, South, East, Error, Error}, //20 - AtTopFrontBorder 00231 { West, Behind, South, Error, Error, Error}, //21 - AtTopRightFrontBorder 00232 { Behind, South, East, Error, Error, Error}, //22 - AtTopLeftFrontBorder 00233 { Error, Error, Error, Error, Error, Error}, 00234 { North, West, Behind, East, Error, Error}, //24 - AtBottomFrontBorder 00235 { North, West, Behind, Error, Error, Error}, //25 - AtBottomRightFrontBorder 00236 { North, Behind, East, Error, Error, Error}, //26 - AtBottomLeftFrontBorder 00237 { Error, Error, Error, Error, Error, Error}, 00238 { Error, Error, Error, Error, Error, Error}, 00239 { Error, Error, Error, Error, Error, Error}, 00240 { Error, Error, Error, Error, Error, Error}, 00241 { Error, Error, Error, Error, Error, Error}, 00242 { InFront, North, West, South, East,Error}, //32 - AtRearBorder 00243 { InFront, North, West, South, Error, Error}, //33 - AtRearRightBorder 00244 { InFront, North, South, East, Error, Error}, //34 - AtRearLeftBorder 00245 { Error, Error, Error, Error, Error, Error}, 00246 { InFront, West, South, East, Error, Error}, //36 - AtTopRearBorder 00247 { InFront, West, South, Error, Error, Error}, //37 - AtTopRightRearBorder 00248 { InFront, South, East, Error, Error, Error}, //38 - AtTopLeftRearBorder 00249 { Error, Error, Error, Error, Error, Error}, 00250 { InFront, North, West, East, Error, Error}, //40 - AtBottomRearBorder 00251 { InFront, North, West, Error, Error, Error}, //41 - AtBottomRightRearBorder 00252 { InFront, North, East, Error, Error, Error} //42 - AtBottomLeftRearBorder 00253 }; 00254 return c[b][index]; 00255 } 00256 00257 /** The valid direction three codes in anti causal direction (means: look back in scanline 00258 direction)when the center is at the volume border. 00259 Should be used with isAtVolumeBorderCausal to determine the Directions, as this 00260 avoids using of the nonesense border ids (e.g. 0,1,8,9...) of this table. 00261 \a index must be in the range <tt>0...nearBorderDirectionCount(b)-1</tt>. 00262 */ 00263 static Direction nearBorderDirectionsCausal(AtVolumeBorder b, int index) 00264 { 00265 static Direction c[43][3] = { 00266 { InFront, North, West}, // 0 - NotAtBorder -----> should never be used 00267 { InFront, North, West}, // 1 - AtRightBorder -----> should never be used 00268 { InFront, North, Error}, // 2 - AtLeftBorder 00269 { Error, Error, Error}, 00270 { InFront, West, Error}, // 4 - AtTopBorder 00271 { InFront, West, Error}, // 5 - AtTopRightBorder 00272 { InFront, Error,Error}, // 6 - AtTopLeftBorder 00273 { Error, Error, Error}, 00274 { InFront, North, West}, // 8 - AtBottomBorder -----> should never be used 00275 { InFront, North, West}, // 9 - AtBottomRightBorder -----> should never be used 00276 { InFront, North, Error}, //10- AtBottomLeftBorder 00277 { Error, Error, Error}, 00278 { Error, Error, Error}, 00279 { Error, Error, Error}, 00280 { Error, Error, Error}, 00281 { Error, Error, Error}, 00282 { North, West, Error}, //16 - AtFrontBorder 00283 { North, West, Error}, //17 - AtFrontRightBorder 00284 { North, Error, Error}, //18 - AtFrontLeftBorder 00285 { Error, Error, Error}, 00286 { West, Error, Error}, //20 - AtTopFrontBorder 00287 { West, Error, Error}, //21 - AtTopRightFrontBorder 00288 { Error, Error, Error}, //22 - AtTopLeftFrontBorder 00289 { Error, Error, Error}, 00290 { North, West, Error}, //24 - AtBottomFrontBorder 00291 { North, West, Error}, //25 - AtBottomRightFrontBorder 00292 { North, Error, Error}, //26 - AtBottomLeftFrontBorder 00293 { Error, Error, Error}, 00294 { Error, Error, Error}, 00295 { Error, Error, Error}, 00296 { Error, Error, Error}, 00297 { Error, Error, Error}, 00298 { InFront, North, West}, //32 - AtRearBorder -----> should never be used 00299 { InFront, North, West}, //33 - AtRearRightBorder -----> should never be used 00300 { InFront, North, Error}, //34 - AtRearLeftBorder 00301 { Error, Error, Error}, 00302 { InFront, West, Error}, //36 - AtTopRearBorder 00303 { InFront, West, Error}, //37 - AtTopRightRearBorder 00304 { InFront, Error, Error}, //38 - AtTopLeftRearBorder 00305 { Error, Error, Error}, 00306 { InFront, North, West}, //40 - AtBottomRearBorder -----> should never be used 00307 { InFront, North, West}, //41 - AtBottomRightRearBorder -----> should never be used 00308 { InFront, North, Error} //42 - AtBottomLeftRearBorder 00309 }; 00310 return c[b][index]; 00311 } 00312 00313 /** transform direction code into corresponding Diff3D offset. 00314 (note: there is no bounds checking on the code you pass.) 00315 */ 00316 static Diff3D const & diff(Direction code) 00317 { 00318 static Diff3D d[] = { 00319 Diff3D( 0, 0, -1), //InFront 00320 Diff3D( 0, -1, 0), //North 00321 Diff3D( -1, 0, 0), //West 00322 Diff3D( 0, 0, 1), //Behind 00323 Diff3D( 0, 1, 0), //South 00324 Diff3D( 1, 0, 0) //East 00325 }; 00326 return d[code]; 00327 } 00328 00329 /** Equivalent to <tt>diff(static_cast<Direction>(code))</tt>. 00330 (note: there is no bounds checking on the code you pass.) 00331 */ 00332 static Diff3D const & diff(int code) { return diff(static_cast<Direction>(code)); } 00333 00334 /** Equivalent to <tt>diff(code)[dim]</tt> */ 00335 static int diff(Direction code, int dim) { return diff(code)[dim]; } 00336 00337 /** Get the relative offset from one neighbor to the other. 00338 For example, <tt>relativeDiff(East, West) == multi_differencetype(-2,0,0)</tt>. 00339 (note: there is no bounds checking on the code you pass.) 00340 */ 00341 static Diff3D const & relativeDiff(Direction fromCode, Direction toCode) 00342 { 00343 static Diff3D d[6][6] = 00344 { 00345 // InFront - North - West - Behind - South - East 00346 { Diff3D( 0, 0, 0), Diff3D(0, -1, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 2), Diff3D( 0, 1, 1), Diff3D( 1, 0, 1)}, //InFront 00347 { Diff3D( 0, 1,-1), Diff3D( 0, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 1), Diff3D( 0, 2, 0), Diff3D( 1, 1, 0)}, //North 00348 { Diff3D( 1, 0,-1), Diff3D( 1,-1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 1), Diff3D( 1, 1, 0), Diff3D( 2, 0, 0)}, //West 00349 { Diff3D( 0, 0,-2), Diff3D( 0,-1,-1), Diff3D(-1, 0,-1), Diff3D( 0, 0, 0), Diff3D( 0, 1,-1), Diff3D( 1, 0,-1)}, //Behind 00350 { Diff3D( 0,-1,-1), Diff3D( 0,-2, 0), Diff3D(-1,-1, 0), Diff3D( 0,-1, 1), Diff3D( 0, 0, 0), Diff3D( 1,-1, 0)}, //South 00351 { Diff3D(-1, 0,-1), Diff3D(-1,-1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 1), Diff3D(-1, 1, 0), Diff3D( 0, 0, 0) } //East 00352 }; 00353 00354 return d[fromCode][toCode]; 00355 } 00356 00357 /** Equivalent to relativeDiff(static_cast<Direction>(fromCode), static_cast<Direction>(toCode)). 00358 (note: there is no bounds checking on the code you pass.) 00359 */ 00360 static Diff3D const & relativeDiff(int fromCode, int toCode) 00361 { 00362 return relativeDiff(static_cast<Direction>(fromCode), static_cast<Direction>(toCode)); 00363 } 00364 00365 /** X-component of diff() */ 00366 static int dX(Direction code) { return diff(code)[0]; } 00367 /** Y-component of diff() */ 00368 static int dY(Direction code) { return diff(code)[1]; } 00369 /** Z-component of diff() */ 00370 static int dZ(Direction code) { return diff(code)[2]; } 00371 00372 /** X-component of diff() */ 00373 static int dX(int code) { return diff(code)[0]; } 00374 /** Y-component of diff() */ 00375 static int dY(int code) { return diff(code)[1]; } 00376 /** Z-component of diff() */ 00377 static int dZ(int code) { return diff(code)[2]; } 00378 00379 00380 /** transform Diff3D offset into corresponding direction code. 00381 The code <tt>Direction::Error</tt> will be returned if <tt>diff</tt> 00382 is not in the 3DSix-Neighborhood. 00383 */ 00384 static Direction code(Diff3D const & diff) 00385 { 00386 switch(diff[0]) { 00387 case 0: 00388 { 00389 switch(diff[1]) { 00390 case 0: 00391 switch(diff[2]) { 00392 case 1: 00393 return Behind; 00394 case -1: 00395 return InFront; 00396 default: 00397 return Error; 00398 } 00399 00400 case 1: 00401 return (diff[2] == 0) ? South : Error; 00402 case -1: 00403 return (diff[2] == 0) ? North : Error; 00404 default: 00405 return Error; 00406 } 00407 } 00408 case -1: 00409 return ((diff[1] == 0) && (diff[2] == 0)) ? West : Error; 00410 case 1: 00411 return ((diff[1] == 0) && (diff[2] == 0)) ? East : Error; 00412 } 00413 return Error; 00414 } 00415 00416 /** Check whether a code refers to a diagonal direction. 00417 Useful if you want to abstract the differences between 6- and 26-neighborhood. 00418 Always <tt>false</tt> for 6-neighborhood. 00419 */ 00420 static bool isDiagonal(Direction) { return false; } 00421 00422 static Diff3D const & right() { return diff(East); } /**< Offset to the right neighbor */ 00423 static Diff3D const & top() { return diff(North); } /**< Offset to the top neighbor */ 00424 static Diff3D const & left() { return diff(West); } /**< Offset to the left neighbor */ 00425 static Diff3D const & bottom() { return diff(South); } /**< Offset to the bottom neighbor */ 00426 static Diff3D const & rear() { return diff(Behind); } /**< Offset to the rear neighbor */ 00427 static Diff3D const & front() { return diff(InFront); } /**< Offset to the neighbor in front */ 00428 00429 static Diff3D const & east() { return diff(East); } /**< Offset to the east neighbor */ 00430 static Diff3D const & north() { return diff(North); } /**< Offset to the north neighbor */ 00431 static Diff3D const & west() { return diff(West); } /**< Offset to the west neighbor */ 00432 static Diff3D const & south() { return diff(South); } /**< Offset to the south neighbor */ 00433 static Diff3D const & behind() { return diff(Behind); } /**< Offset to the rear neighbor */ 00434 static Diff3D const & infront() { return diff(InFront); } /**< Offset to the neighbor in front */ 00435 00436 }; // class Neighborhood3DSix 00437 00438 00439 /** Export NeighborCode3D::Direction into the scope of namespace Neighborhood3DSix. 00440 */ 00441 typedef NeighborCode3D::Direction Direction; 00442 00443 static const Direction East = NeighborCode3D::East; /**< Export NeighborCode3D::East to namespace Neighborhood3DSix */ 00444 static const Direction North = NeighborCode3D::North; /**< Export NeighborCode3D::North to namespace Neighborhood3DSix */ 00445 static const Direction West = NeighborCode3D::West; /**< Export NeighborCode3D::West to namespace Neighborhood3DSix */ 00446 static const Direction South = NeighborCode3D::South; /**< Export NeighborCode3D::South to namespace Neighborhood3DSix */ 00447 static const Direction Behind = NeighborCode3D::Behind; /**< Export NeighborCode3D::Behind to namespace Neighborhood3DSix */ 00448 static const Direction InFront = NeighborCode3D::InFront; /**< Export NeighborCode3D::InFront to namespace Neighborhood3DSix */ 00449 static const Direction DirectionCount = NeighborCode3D::DirectionCount; /**< Export NeighborCode3D::DirectionCount to namespace Neighborhood3DSix */ 00450 00451 00452 }//namespace Neighborhood3DSix 00453 00454 /** Export \ref vigra::Neighborhood3DSix::NeighborCode3D into the scope of namespace vigra. 00455 */ 00456 typedef Neighborhood3DSix::NeighborCode3D NeighborCode3DSix; 00457 00458 /********************************************************/ 00459 /* */ 00460 /* Neighborhood3DTwentySix */ 00461 /* */ 00462 /********************************************************/ 00463 /** 3D 26-Neighborhood. */ 00464 namespace Neighborhood3DTwentySix 00465 { 00466 00467 /** \brief Encapsulation of direction management of neighbors for a 3D 26-neighborhood. 00468 */ 00469 class NeighborCode3D 00470 { 00471 public: 00472 00473 typedef Diff3D difference_type; 00474 00475 /** provides enumeration of all directions. 00476 DirectionCount may be used for portable loop termination conditions. 00477 */ 00478 enum Direction { 00479 Error = -1, 00480 InFrontNorthWest = 0, 00481 InFrontNorth, 00482 InFrontNorthEast, 00483 InFrontWest, 00484 InFront, 00485 InFrontEast, 00486 InFrontSouthWest, 00487 InFrontSouth, 00488 InFrontSouthEast, 00489 00490 NorthWest, 00491 North, 00492 NorthEast, 00493 West, 00494 East, 00495 SouthWest, 00496 South, 00497 SouthEast, 00498 00499 BehindNorthWest, 00500 BehindNorth, 00501 BehindNorthEast, 00502 BehindWest, 00503 Behind, 00504 BehindEast, 00505 BehindSouthWest, 00506 BehindSouth, 00507 BehindSouthEast, 00508 00509 DirectionCount, 00510 CausalFirst = InFrontNorthWest, 00511 CausalLast = West, 00512 AntiCausalFirst = BehindSouthEast, 00513 AntiCausalLast = East, 00514 00515 InitialDirection = InFrontNorthWest, 00516 OppositeDirPrefix = -1, 00517 OppositeOffset = 25 00518 }; 00519 00520 static unsigned int directionBit(Direction d) 00521 { 00522 static unsigned int b[] = { 00523 1 << (InFrontNorthWest+1), 00524 1 << (InFrontNorth+1), 00525 1 << (InFrontNorthEast+1), 00526 1 << (InFrontWest+1), 00527 1 << (InFront+1), 00528 1 << (InFrontEast+1), 00529 1 << (InFrontSouthWest+1), 00530 1 << (InFrontSouth+1), 00531 1 << (InFrontSouthEast+1), 00532 00533 1 << (NorthWest+1), 00534 1 << (North+1), 00535 1 << (NorthEast+1), 00536 1 << (West+1), 00537 1 << (East+1), 00538 1 << (SouthWest+1), 00539 1 << (South+1), 00540 1 << (SouthEast+1), 00541 00542 1 << (BehindNorthWest+1), 00543 1 << (BehindNorth+1), 00544 1 << (BehindNorthEast+1), 00545 1 << (BehindWest+1), 00546 1 << (Behind+1), 00547 1 << (BehindEast+1), 00548 1 << (BehindSouthWest+1), 00549 1 << (BehindSouth+1), 00550 1 << (BehindSouthEast+1) 00551 }; 00552 return b[d]; 00553 }; 00554 00555 00556 /** The number of valid neighbors if the current center is at the volume border. 00557 */ 00558 static unsigned int nearBorderDirectionCount(AtVolumeBorder b) 00559 { 00560 static unsigned int c[] = { 26, 17, 17, 0, 17, 11, 11, 0, 17, 11, 00561 11, 0, 0, 0, 0, 0, 17, 11, 11, 0, 00562 11, 7, 7, 0, 11, 7, 7, 0, 0, 0, 00563 0, 0, 17, 11, 11, 0, 11, 7, 7, 0, 00564 11, 7, 7}; 00565 return c[b]; 00566 } 00567 00568 /** The valid direction codes when the center is at the volume border. 00569 \a index must be in the range <tt>0...nearBorderDirectionCount(b)-1</tt>. 00570 */ 00571 static Direction nearBorderDirections(AtVolumeBorder b, int index) 00572 { 00573 static Direction c[43][26] = { 00574 //0 - NotAtBorder 00575 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00576 InFrontWest, InFront, InFrontEast, 00577 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 00578 00579 NorthWest, North, NorthEast, 00580 West, East, 00581 SouthWest, South, SouthEast, 00582 00583 BehindNorthWest, BehindNorth, BehindNorthEast, 00584 BehindWest, Behind, BehindEast, 00585 BehindSouthWest, BehindSouth, BehindSouthEast}, 00586 //1 - AtRightBorder 00587 { InFrontNorthWest, InFrontNorth, /*InFrontNorthEast,*/ 00588 InFrontWest, InFront, /*InFrontEast,*/ 00589 InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ 00590 00591 NorthWest, North, /*NorthEast,*/ 00592 West, /*East,*/ 00593 SouthWest, South, /*SouthEast,*/ 00594 00595 BehindNorthWest, BehindNorth, /*BehindNorthEast,*/ 00596 BehindWest, Behind, /*BehindEast,*/ 00597 BehindSouthWest, BehindSouth, /*BehindSouthEast,*/ 00598 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00599 //2 - AtLeftBorder 00600 { /*InFrontNorthWest,*/ InFrontNorth, InFrontNorthEast, 00601 /*InFrontWest,*/ InFront, InFrontEast, 00602 /*InFrontSouthWest,*/ InFrontSouth, InFrontSouthEast, 00603 00604 /*NorthWest,*/ North, NorthEast, 00605 /*West,*/ East, 00606 /*SouthWest,*/ South, SouthEast, 00607 00608 /*BehindNorthWest,*/ BehindNorth, BehindNorthEast, 00609 /*BehindWest,*/ Behind, BehindEast, 00610 /*BehindSouthWest,*/ BehindSouth, BehindSouthEast, 00611 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00612 //3 - Nothin' 00613 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00614 Error, Error, Error, Error, Error, Error, Error, Error, 00615 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00616 //4 - AtTopBorder 00617 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 00618 InFrontWest, InFront, InFrontEast, 00619 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 00620 00621 /*NorthWest, North, NorthEast,*/ 00622 West, East, 00623 SouthWest, South, SouthEast, 00624 00625 /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ 00626 BehindWest, Behind, BehindEast, 00627 BehindSouthWest, BehindSouth, BehindSouthEast, 00628 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00629 //5 - AtTopRightBorder 00630 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 00631 InFrontWest, InFront, /*InFrontEast,*/ 00632 InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ 00633 00634 /*NorthWest, North, NorthEast,*/ 00635 West, /*East,*/ 00636 SouthWest, South, /*SouthEast,*/ 00637 00638 /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ 00639 BehindWest, Behind, /*BehindEast,*/ 00640 BehindSouthWest, BehindSouth, /*BehindSouthEast,*/ 00641 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00642 Error, Error, Error, Error, Error, Error}, 00643 //6 - AtTopLeftBorder 00644 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 00645 /*InFrontWest,*/ InFront, InFrontEast, 00646 /*InFrontSouthWest,*/ InFrontSouth, InFrontSouthEast, 00647 00648 /*NorthWest, North, NorthEast,*/ 00649 /*West,*/ East, 00650 /*SouthWest,*/ South, SouthEast, 00651 00652 /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ 00653 /*BehindWest, */ Behind, BehindEast, 00654 /*BehindSouthWest,*/ BehindSouth, BehindSouthEast, 00655 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00656 Error, Error, Error, Error, Error, Error}, 00657 //7 - Nothin' 00658 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00659 Error, Error, Error, Error, Error, Error, Error, Error, 00660 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00661 //8 - AtBottomBorder 00662 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00663 InFrontWest, InFront, InFrontEast, 00664 /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00665 00666 NorthWest, North, NorthEast, 00667 West, East, 00668 /*SouthWest, South, SouthEast,*/ 00669 00670 BehindNorthWest, BehindNorth, BehindNorthEast, 00671 BehindWest, Behind, BehindEast, 00672 /*BehindSouthWest, BehindSouth, BehindSouthEast*/ 00673 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00674 //9 - AtBottomRightBorder 00675 { InFrontNorthWest, InFrontNorth, /*InFrontNorthEast,*/ 00676 InFrontWest, InFront, /*InFrontEast,*/ 00677 /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00678 00679 NorthWest, North, /*NorthEast,*/ 00680 West, /*East,*/ 00681 /*SouthWest, South, SouthEast,*/ 00682 00683 BehindNorthWest, BehindNorth, /*BehindNorthEast,*/ 00684 BehindWest, Behind, /*BehindEast,*/ 00685 /*BehindSouthWest, BehindSouth, BehindSouthEast*/ 00686 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00687 Error, Error, Error, Error, Error, Error}, 00688 //10 - AtBottomLeftBorder 00689 { /*InFrontNorthWest,*/ InFrontNorth, InFrontNorthEast, 00690 /*InFrontWest,*/ InFront, InFrontEast, 00691 /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00692 00693 /*NorthWest,*/ North, NorthEast, 00694 /*West,*/ East, 00695 /*SouthWest, South, SouthEast,*/ 00696 00697 /*BehindNorthWest,*/ BehindNorth, BehindNorthEast, 00698 /*BehindWest,*/ Behind, BehindEast, 00699 /*BehindSouthWest, BehindSouth, BehindSouthEast*/ 00700 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00701 Error, Error, Error, Error, Error, Error}, 00702 //11 - Nothin' 00703 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00704 Error, Error, Error, Error, Error, Error, Error, Error, 00705 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00706 //12 - Nothin' 00707 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00708 Error, Error, Error, Error, Error, Error, Error, Error, 00709 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00710 //13 - Nothin' 00711 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00712 Error, Error, Error, Error, Error, Error, Error, Error, 00713 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00714 //14 - Nothin' 00715 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00716 Error, Error, Error, Error, Error, Error, Error, Error, 00717 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00718 //15 - Nothin' 00719 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00720 Error, Error, Error, Error, Error, Error, Error, Error, 00721 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00722 //16 - AtFrontBorder 00723 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00724 InFrontWest, InFront, InFrontEast, 00725 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00726 00727 NorthWest, North, NorthEast, 00728 West, East, 00729 SouthWest, South, SouthEast, 00730 00731 BehindNorthWest, BehindNorth, BehindNorthEast, 00732 BehindWest, Behind, BehindEast, 00733 BehindSouthWest, BehindSouth, BehindSouthEast, 00734 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00735 //17 - AtFrontRightBorder 00736 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00737 InFrontWest, InFront, InFrontEast, 00738 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00739 00740 NorthWest, North, /*NorthEast,*/ 00741 West, /*East,*/ 00742 SouthWest, South, /*SouthEast,*/ 00743 00744 BehindNorthWest, BehindNorth, /*BehindNorthEast,*/ 00745 BehindWest, Behind, /*BehindEast,*/ 00746 BehindSouthWest, BehindSouth, /*BehindSouthEast,*/ 00747 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00748 Error, Error, Error, Error, Error, Error}, 00749 //18 - AtFrontLeftBorder 00750 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00751 InFrontWest, InFront, InFrontEast, 00752 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00753 00754 /*NorthWest,*/ North, NorthEast, 00755 /*West,*/ East, 00756 /*SouthWest,*/ South, SouthEast, 00757 00758 /*BehindNorthWest,*/ BehindNorth, BehindNorthEast, 00759 /*BehindWest,*/ Behind, BehindEast, 00760 /*BehindSouthWest,*/ BehindSouth, BehindSouthEast, 00761 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00762 Error, Error, Error, Error, Error, Error}, 00763 //19 - Nothin' 00764 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00765 Error, Error, Error, Error, Error, Error, Error, Error, 00766 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00767 //20 - AtTopFrontBorder 00768 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00769 InFrontWest, InFront, InFrontEast, 00770 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00771 00772 /*NorthWest, North, NorthEast,*/ 00773 West, East, 00774 SouthWest, South, SouthEast, 00775 00776 /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ 00777 BehindWest, Behind, BehindEast, 00778 BehindSouthWest, BehindSouth, BehindSouthEast, 00779 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00780 Error, Error, Error, Error, Error, Error}, 00781 //21 - AtTopRightFrontBorder 00782 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00783 InFrontWest, InFront, InFrontEast, 00784 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00785 00786 /*NorthWest, North, NorthEast,*/ 00787 West, /*East,*/ 00788 SouthWest, South, /*SouthEast,*/ 00789 00790 /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ 00791 BehindWest, Behind, /*BehindEast,*/ 00792 BehindSouthWest, BehindSouth, /*BehindSouthEast,*/ 00793 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00794 Error, Error, Error, Error, Error, Error, 00795 Error, Error, Error, Error}, 00796 //22 - AtTopLeftFrontBorder 00797 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00798 InFrontWest, InFront, InFrontEast, 00799 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00800 00801 /*NorthWest, North, NorthEast,*/ 00802 /*West,*/ East, 00803 /*SouthWest,*/ South, SouthEast, 00804 00805 /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ 00806 /*BehindWest,*/ Behind, BehindEast, 00807 /*BehindSouthWest,*/ BehindSouth, BehindSouthEast, 00808 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00809 Error, Error, Error, Error, Error, Error, 00810 Error, Error, Error, Error}, 00811 //23 - Nothin' 00812 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00813 Error, Error, Error, Error, Error, Error, Error, Error, 00814 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00815 //24 - AtBottomFrontBorder 00816 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00817 InFrontWest, InFront, InFrontEast, 00818 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00819 00820 NorthWest, North, NorthEast, 00821 West, East, 00822 /*SouthWest, South, SouthEast,*/ 00823 00824 BehindNorthWest, BehindNorth, BehindNorthEast, 00825 BehindWest, Behind, BehindEast, 00826 /*BehindSouthWest, BehindSouth, BehindSouthEast*/ 00827 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00828 Error, Error, Error, Error, Error, Error}, 00829 //25 - AtBottomRightFrontBorder 00830 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00831 InFrontWest, InFront, InFrontEast, 00832 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00833 00834 NorthWest, North, /*NorthEast,*/ 00835 West, /* East,*/ 00836 /*SouthWest, South, SouthEast,*/ 00837 00838 BehindNorthWest, BehindNorth, /*BehindNorthEast,*/ 00839 BehindWest, Behind, /*BehindEast,*/ 00840 /*BehindSouthWest, BehindSouth, BehindSouthEast*/ 00841 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00842 Error, Error, Error, Error, Error, Error, 00843 Error, Error, Error, Error}, 00844 //26 - AtBottomLeftFrontBorder 00845 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00846 InFrontWest, InFront, InFrontEast, 00847 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00848 00849 /*NorthWest,*/ North, NorthEast, 00850 /*West,*/ East, 00851 /*SouthWest, South, SouthEast,*/ 00852 00853 /*BehindNorthWest,*/ BehindNorth, BehindNorthEast, 00854 /*BehindWest,*/ Behind, BehindEast, 00855 /*BehindSouthWest, BehindSouth, BehindSouthEast*/ 00856 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00857 Error, Error, Error, Error, Error, Error, 00858 Error, Error, Error, Error}, 00859 //27 - Nothin' 00860 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00861 Error, Error, Error, Error, Error, Error, Error, Error, 00862 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00863 //28 - Nothin' 00864 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00865 Error, Error, Error, Error, Error, Error, Error, Error, 00866 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00867 //29 - Nothin' 00868 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00869 Error, Error, Error, Error, Error, Error, Error, Error, 00870 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00871 //30 - Nothin' 00872 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00873 Error, Error, Error, Error, Error, Error, Error, Error, 00874 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00875 //31 - Nothin' 00876 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00877 Error, Error, Error, Error, Error, Error, Error, Error, 00878 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00879 //32 - AtRearBorder 00880 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00881 InFrontWest, InFront, InFrontEast, 00882 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 00883 00884 NorthWest, North, NorthEast, 00885 West, East, 00886 SouthWest, South, SouthEast, 00887 00888 /*BehindNorthWest, BehindNorth, BehindNorthEast, 00889 BehindWest, Behind, BehindEast, 00890 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 00891 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00892 //33 - AtRearRightBorder 00893 { InFrontNorthWest, InFrontNorth, /*InFrontNorthEast,*/ 00894 InFrontWest, InFront, /*InFrontEast,*/ 00895 InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ 00896 00897 NorthWest, North, /*NorthEast,*/ 00898 West, /*East,*/ 00899 SouthWest, South, /*SouthEast,*/ 00900 00901 /*BehindNorthWest, BehindNorth, BehindNorthEast, 00902 BehindWest, Behind, BehindEast, 00903 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 00904 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00905 Error, Error, Error, Error, Error, Error}, 00906 //34 - AtRearLeftBorder 00907 { /*InFrontNorthWest,*/ InFrontNorth, InFrontNorthEast, 00908 /*InFrontWest,*/ InFront, InFrontEast, 00909 /*InFrontSouthWest,*/ InFrontSouth, InFrontSouthEast, 00910 00911 /*NorthWest,*/ North, NorthEast, 00912 /*West,*/ East, 00913 /*SouthWest,*/ South, SouthEast, 00914 00915 /*BehindNorthWest, BehindNorth, BehindNorthEast, 00916 BehindWest, Behind, BehindEast, 00917 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 00918 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00919 Error, Error, Error, Error, Error, Error}, 00920 //35 - Nothin' 00921 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00922 Error, Error, Error, Error, Error, Error, Error, Error, 00923 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00924 //36 - AtTopRearBorder 00925 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 00926 InFrontWest, InFront, InFrontEast, 00927 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 00928 00929 /*NorthWest, North, NorthEast,*/ 00930 West, East, 00931 SouthWest, South, SouthEast, 00932 00933 /*BehindNorthWest, BehindNorth, BehindNorthEast, 00934 BehindWest, Behind, BehindEast, 00935 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 00936 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00937 Error, Error, Error, Error, Error, Error}, 00938 //37 - AtTopRightRearBorder 00939 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 00940 InFrontWest, InFront, /*InFrontEast,*/ 00941 InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ 00942 00943 /*NorthWest, North, NorthEast,*/ 00944 West, /*East,*/ 00945 SouthWest, South, /*SouthEast,*/ 00946 00947 /*BehindNorthWest, BehindNorth, BehindNorthEast, 00948 BehindWest, Behind, BehindEast, 00949 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 00950 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00951 Error, Error, Error, Error, Error, Error, 00952 Error, Error, Error, Error}, 00953 //38 - AtTopLeftRearBorder 00954 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 00955 /*InFrontWest,*/ InFront, InFrontEast, 00956 /*InFrontSouthWest,*/ InFrontSouth, InFrontSouthEast, 00957 00958 /*NorthWest, North, NorthEast,*/ 00959 /*West,*/ East, 00960 /*SouthWest,*/ South, SouthEast, 00961 00962 /*BehindNorthWest, BehindNorth, BehindNorthEast, 00963 BehindWest, Behind, BehindEast, 00964 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 00965 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00966 Error, Error, Error, Error, Error, Error, 00967 Error, Error, Error, Error}, 00968 //39 - Nothin' 00969 { Error, Error, Error, Error, Error, Error, Error, Error, Error, 00970 Error, Error, Error, Error, Error, Error, Error, Error, 00971 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 00972 //40 - AtBottomRearBorder 00973 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 00974 InFrontWest, InFront, InFrontEast, 00975 /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00976 00977 NorthWest, North, NorthEast, 00978 West, East, 00979 /*SouthWest, South, SouthEast,*/ 00980 00981 /*BehindNorthWest, BehindNorth, BehindNorthEast, 00982 BehindWest, Behind, BehindEast, 00983 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 00984 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00985 Error, Error, Error, Error, Error, Error}, 00986 //41 - AtBottomRightRearBorder 00987 { InFrontNorthWest, InFrontNorth, /*InFrontNorthEast,*/ 00988 InFrontWest, InFront, /*InFrontEast,*/ 00989 /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 00990 00991 NorthWest, North, /*NorthEast,*/ 00992 West, /*East,*/ 00993 /*SouthWest, South, SouthEast,*/ 00994 00995 /*BehindNorthWest, BehindNorth, BehindNorthEast, 00996 BehindWest, Behind, BehindEast, 00997 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 00998 Error, Error, Error, Error, Error, Error, Error, Error, Error, 00999 Error, Error, Error, Error, Error, Error, 01000 Error, Error, Error, Error}, 01001 //42 - AtBottomLeftRearBorder 01002 { /*InFrontNorthWest,*/ InFrontNorth, InFrontNorthEast, 01003 /*InFrontWest,*/ InFront, InFrontEast, 01004 /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01005 01006 /*NorthWest,*/ North, NorthEast, 01007 /*West,*/ East, 01008 /*SouthWest, South, SouthEast,*/ 01009 01010 /*BehindNorthWest, BehindNorth, BehindNorthEast, 01011 BehindWest, Behind, BehindEast, 01012 BehindSouthWest, BehindSouth, BehindSouthEast,*/ 01013 Error, Error, Error, Error, Error, Error, Error, Error, Error, 01014 Error, Error, Error, Error, Error, Error, 01015 Error, Error, Error, Error} 01016 }; 01017 return c[b][index]; 01018 } 01019 01020 /** The valid direction three codes in anti causal direction (means: look back in scanline 01021 direction)when the center is at the volume border. 01022 Should be used with isAtVolumeBorderCausal to determine the Directions, as this 01023 avoids using of the nonesense border ids (e.g. 0,1,8,9...) of this table. 01024 \a index must be in the range <tt>0...nearBorderDirectionCount(b)-1</tt>. 01025 */ 01026 static Direction nearBorderDirectionsCausal(AtVolumeBorder b, int index) 01027 { 01028 static Direction c[43][13] = { 01029 //0 - NotAtBorder -----> should never be used 01030 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01031 InFrontWest, InFront, InFrontEast, 01032 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01033 01034 NorthWest, North, NorthEast, 01035 West}, 01036 //1 - AtRightBorder -----> should never be used 01037 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01038 InFrontWest, InFront, InFrontEast, 01039 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01040 01041 NorthWest, North, NorthEast, 01042 West}, 01043 //2 - AtLeftBorder 01044 { /*InFrontNorthWest,*/ InFrontNorth,InFrontNorthEast, 01045 /*InFrontWest,*/ InFront, InFrontEast, 01046 /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, 01047 01048 /*NorthWest,*/ North, NorthEast, 01049 /*West*/ 01050 Error, Error, Error, Error, Error}, 01051 //3 - Nothin' 01052 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01053 //4 - AtTopBorder 01054 { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast,*/ 01055 InFrontWest, InFront, InFrontEast, 01056 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01057 01058 /*NorthWest, North, NorthEast,*/ 01059 West, 01060 Error, Error, Error, Error, Error, Error}, 01061 //5 - AtTopRightBorder 01062 { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast,*/ 01063 InFrontWest, InFront, /*InFrontEast,*/ 01064 InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ 01065 01066 /*NorthWest, North, NorthEast,*/ 01067 West, 01068 Error, Error, Error, Error, Error, Error, Error, Error}, 01069 //6 - AtTopLeftBorder 01070 { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast,*/ 01071 /*InFrontWest,*/ InFront, InFrontEast, 01072 /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, 01073 01074 /*NorthWest, North, NorthEast,*/ 01075 /*West,*/ 01076 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01077 //7 - Nothin' 01078 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01079 //8 - AtBottomBorder -----> should never be used 01080 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01081 InFrontWest, InFront, InFrontEast, 01082 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01083 01084 NorthWest, North, NorthEast, 01085 West}, 01086 //9 - AtBottomRightBorder -----> should never be used 01087 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01088 InFrontWest, InFront, InFrontEast, 01089 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01090 01091 NorthWest, North, NorthEast, 01092 West}, 01093 //10 - AtBottomLeftBorder 01094 { /*InFrontNorthWest,*/InFrontNorth, InFrontNorthEast, 01095 /*InFrontWest,*/ InFront, InFrontEast, 01096 /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, 01097 01098 /*NorthWest,*/ North, NorthEast, 01099 /*West*/ 01100 Error, Error, Error, Error, Error}, 01101 //11 - Nothin' 01102 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01103 //12 - Nothin' 01104 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01105 //13 - Nothin' 01106 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01107 //14 - Nothin' 01108 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01109 //15 - Nothin' 01110 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01111 //16 - AtFrontBorder 01112 { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast, 01113 InFrontWest, InFront, InFrontEast, 01114 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01115 01116 NorthWest, North, NorthEast, 01117 West, 01118 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01119 //17 - AtFrontRightBorder 01120 { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast, 01121 InFrontWest, InFront, InFrontEast, 01122 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01123 01124 NorthWest, North, /*NorthEast,*/ 01125 West, 01126 Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01127 //18 - AtFrontLeftBorder 01128 { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast, 01129 InFrontWest, InFront, InFrontEast, 01130 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01131 01132 /*NorthWest,*/ North, NorthEast, 01133 /*West,*/ 01134 Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01135 //19 - Nothin' 01136 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01137 //20 - AtTopFrontBorder 01138 { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast, 01139 InFrontWest, InFront, InFrontEast, 01140 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01141 01142 /*NorthWest, North, NorthEast,*/ 01143 West, 01144 Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01145 //21 - AtTopRightFrontBorder 01146 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01147 InFrontWest, InFront, InFrontEast, 01148 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01149 01150 /*NorthWest, North, NorthEast,*/ 01151 West, 01152 Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01153 //22 - AtTopLeftFrontBorder 01154 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01155 //23 - Nothin 01156 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01157 //24 - AtBottomFrontBorder 01158 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01159 InFrontWest, InFront, InFrontEast, 01160 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01161 01162 NorthWest, North, NorthEast, 01163 West, 01164 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01165 //25 - AtBottomRightFrontBorder 01166 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01167 InFrontWest, InFront, InFrontEast, 01168 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01169 01170 NorthWest, North, /*NorthEast,*/ 01171 West, 01172 Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01173 //26 - AtBottomLeftFrontBorder 01174 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01175 InFrontWest, InFront, InFrontEast, 01176 InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ 01177 01178 /*NorthWest,*/ North, NorthEast, 01179 West, 01180 Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01181 //27 - Nothin 01182 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01183 //28 - Nothin 01184 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01185 //29 - Nothin 01186 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01187 //30 - Nothin 01188 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01189 //31 - Nothin 01190 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01191 //32 - AtRearBorder -----> should never be used 01192 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01193 InFrontWest, InFront, InFrontEast, 01194 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01195 01196 NorthWest, North, NorthEast, 01197 West}, 01198 //33 - AtRearRightBorder -----> should never be used 01199 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01200 InFrontWest, InFront, InFrontEast, 01201 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01202 01203 NorthWest, North, NorthEast, 01204 West}, 01205 //34 - AtRearLeftBorder 01206 { /*InFrontNorthWest,*/InFrontNorth, InFrontNorthEast, 01207 /*InFrontWest,*/ InFront, InFrontEast, 01208 /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, 01209 01210 /*NorthWest,*/ North, NorthEast, 01211 /*West*/ 01212 Error, Error, Error, Error, Error}, 01213 //35 - Nothin 01214 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01215 //36 - AtTopRearBorder 01216 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 01217 InFrontWest, InFront, InFrontEast, 01218 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01219 01220 /*NorthWest, North, NorthEast,*/ 01221 West, 01222 Error, Error, Error, Error, Error, Error}, 01223 //37 - AtTopRightRearBorder 01224 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 01225 InFrontWest, InFront, /*InFrontEast,*/ 01226 InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ 01227 01228 /*NorthWest, North, NorthEast,*/ 01229 West, 01230 Error, Error, Error, Error, Error, Error, Error, Error}, 01231 //38 - AtTopLeftRearBorder 01232 { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ 01233 /*InFrontWest,*/ InFront, InFrontEast, 01234 /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, 01235 01236 /*NorthWest, North, NorthEast,*/ 01237 /*West,*/ 01238 Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01239 //39 - Nothin 01240 { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, 01241 //40 - AtBottomRearBorder -----> should never be used 01242 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01243 InFrontWest, InFront, InFrontEast, 01244 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01245 01246 NorthWest, North, NorthEast, 01247 West}, 01248 //41 - AtBottomRightRearBorder -----> should never be used 01249 { InFrontNorthWest, InFrontNorth, InFrontNorthEast, 01250 InFrontWest, InFront, InFrontEast, 01251 InFrontSouthWest, InFrontSouth, InFrontSouthEast, 01252 01253 NorthWest, North, NorthEast, 01254 West}, 01255 //42 - AtBottomLeftRearBorder 01256 { /*InFrontNorthWest,*/InFrontNorth, InFrontNorthEast, 01257 /*InFrontWest,*/ InFront, InFrontEast, 01258 /*InFrontSouthWest,InFrontSouth, InFrontSouthEast,*/ 01259 01260 /*NorthWest,*/ North, NorthEast, 01261 /*West*/ 01262 Error, Error, Error, Error, Error, Error, Error} 01263 }; 01264 return c[b][index]; 01265 } 01266 01267 /** transform direction code into corresponding Diff3D offset. 01268 (note: there is no bounds checking on the code you pass.) 01269 */ 01270 static Diff3D const & diff(Direction code) 01271 { 01272 static Diff3D d[] = { Diff3D( -1, -1, -1), //InFrontNorthWest 01273 Diff3D( 0, -1, -1), //InFrontNorth 01274 Diff3D( 1, -1, -1), //InFrontNorthEast 01275 Diff3D( -1, 0, -1), //InFrontWest 01276 Diff3D( 0, 0, -1), //InFront 01277 Diff3D( 1, 0, -1), //InFrontEast 01278 Diff3D( -1, 1, -1), //InFrontSouthWest 01279 Diff3D( 0, 1, -1), //InFrontSouth 01280 Diff3D( 1, 1, -1), //InFrontSouthEast 01281 01282 Diff3D( -1, -1, 0), //NorthWest 01283 Diff3D( 0, -1, 0), //North 01284 Diff3D( 1, -1, 0), //NorthEast 01285 Diff3D( -1, 0, 0), //West 01286 Diff3D( 1, 0, 0), //East 01287 Diff3D( -1, 1, 0), //SouthWest 01288 Diff3D( 0, 1, 0), //South 01289 Diff3D( 1, 1, 0), //SouthEast 01290 01291 Diff3D( -1, -1, 1), //BehindNorthWest 01292 Diff3D( 0, -1, 1), //BehindNorth 01293 Diff3D( 1, -1, 1), //BehindNorthEast 01294 Diff3D( -1, 0, 1), //BehindWest 01295 Diff3D( 0, 0, 1), //Behind 01296 Diff3D( 1, 0, 1), //BehindEast 01297 Diff3D( -1, 1, 1), //BehindSouthWest 01298 Diff3D( 0, 1, 1), //BehindSouth 01299 Diff3D( 1, 1, 1), //BehindSouthEast 01300 }; 01301 return d[code]; 01302 } 01303 01304 /** Equivalent to <tt>diff(static_cast<Direction>(code))</tt>. 01305 (note: there is no bounds checking on the code you pass.) 01306 */ 01307 static Diff3D const & diff(int code) { return diff(static_cast<Direction>(code)); } 01308 01309 /** Equivalent to <tt>diff(code)[dim]</tt> */ 01310 static int diff(Direction code, int dim) { return diff(code)[dim]; } 01311 01312 /** Get the relative offset from one neighbor to the other. 01313 For example, <tt>relativeDiff(East, West) == multi_differencetype(-2,0,0)</tt>. 01314 (note: there is no bounds checking on the code you pass.) 01315 */ 01316 static Diff3D const relativeDiff(Direction fromCode, Direction toCode) 01317 { 01318 //Uncomment the following lines may cause the program to crash because of insufficient 01319 //static allocatable memory on the stack 01320 /* 01321 static Diff3D d[][] = { 01322 // InFront-NW --- InFront-N --- InFront-NE --- Infront-W --- InFront --- InFront-E --- InFront-SW --- InFront-S --- InFront-SE --- NorthWest --- North --- NorthEast --- West --- East --- SouthWest --- South --- SouthEast --- Behind-NW --- Behind-N --- Behind-NE --- Behind-W --- Behind --- Behind-E --- Behind-SW --- Behind-S --- Behind-SE 01323 { Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D( 2, 2, 0), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, 1, 1), Diff3D( 2, 1, 1), Diff3D( 0, 2, 1), Diff3D( 1, 2, 1), Diff3D( 2, 2, 1), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D( 2, 0, 2), Diff3D( 0, 1, 2), Diff3D( 1, 1, 2), Diff3D( 2, 1, 2), Diff3D( 0, 2, 2), Diff3D( 1, 2, 2), Diff3D( 2, 2, 2) }, //InFront-NW 01324 { Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D(-1, 1, 1), Diff3D( 1, 1, 1), Diff3D(-1, 2, 1), Diff3D( 0, 2, 1), Diff3D( 1, 2, 1), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D(-1, 1, 2), Diff3D( 0, 1, 2), Diff3D( 1, 1, 2), Diff3D(-1, 2, 2), Diff3D( 0, 2, 2), Diff3D( 1, 2, 2) }, //InFront-N 01325 { Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, 2, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, 1, 1), Diff3D( 0, 1, 1), Diff3D(-2, 2, 1), Diff3D(-1, 2, 1), Diff3D( 0, 2, 1), Diff3D(-2, 0, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D(-2, 1, 2), Diff3D(-1, 1, 2), Diff3D( 0, 1, 2), Diff3D(-2, 2, 2), Diff3D(-1, 2, 2), Diff3D( 0, 2, 2) }, //InFront-NE 01326 { Diff3D(0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D( 2, -1, 1), Diff3D( 0, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D( 2, 1, 1), Diff3D( 0, -1, 2), Diff3D( 1, -1, 2), Diff3D( 2, -1, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D( 2, 0, 2), Diff3D( 0, 1, 2), Diff3D( 1, 1, 2), Diff3D( 2, 1, 2) }, //Infront-W 01327 { Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D(-1, 0, 1), Diff3D( 1, 0, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D(-1, -1, 2), Diff3D( 0, -1, 2), Diff3D( 1, -1, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D(-1, 1, 2), Diff3D( 0, 1, 2), Diff3D( 1, 1, 2) }, //InFront 01328 { Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, -1, 1), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D(-2, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, 1, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1), Diff3D(-2, -1, 2), Diff3D(-1, -1, 2), Diff3D( 0, -1, 2), Diff3D(-2, 0, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D(-2, 1, 2), Diff3D(-1, 1, 2), Diff3D( 0, 1, 2) }, //InFront-E 01329 { Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D( 2, -2, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, -2, 1), Diff3D( 1, -2, 1), Diff3D( 2, -2, 1), Diff3D( 0, -1, 1), Diff3D( 2, -1, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, -2, 2), Diff3D( 1, -2, 2), Diff3D( 2, -2, 2), Diff3D( 0, -1, 2), Diff3D( 1, -1, 2), Diff3D( 2, -1, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D( 2, 0, 2) }, //InFront-SW 01330 { Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, -2, 1), Diff3D( 0, -2, 1), Diff3D( 1, -2, 1), Diff3D(-1, -1, 1), Diff3D( 1, -1, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D(-1, -2, 2), Diff3D( 0, -2, 2), Diff3D( 1, -2, 2), Diff3D(-1, -1, 2), Diff3D( 0, -1, 2), Diff3D( 1, -1, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2) }, //InFront-S 01331 { Diff3D(-2, -2, 0), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, -2, 1), Diff3D(-1, -2, 1), Diff3D( 0, -2, 1), Diff3D(-2, -1, 1), Diff3D( 0, -1, 1), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, -2, 2), Diff3D(-1, -2, 2), Diff3D( 0, -2, 2), Diff3D(-2, -1, 2), Diff3D(-1, -1, 2), Diff3D( 0, -1, 2), Diff3D(-2, 0, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2) }, //InFront-SE 01332 { Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D( 2, 1, -1), Diff3D( 0, 2, -1), Diff3D( 1, 2, -1), Diff3D( 2, 2, -1), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D( 2, 2, 0), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D( 2, 1, 1), Diff3D( 0, 2, 1), Diff3D( 1, 2, 1), Diff3D( 2, 2, 1) }, //NorthWest 01333 { Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D(-1, 2, -1), Diff3D( 0, 2, -1), Diff3D( 1, 2, -1), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 1, 1, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D(-1, 2, 1), Diff3D( 0, 2, 1), Diff3D( 1, 2, 1) }, //North 01334 { Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, 1, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D(-2, 2, -1), Diff3D(-1, 2, -1), Diff3D( 0, 2, -1), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, 2, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, 1, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1), Diff3D(-2, 2, 1), Diff3D(-1, 2, 1), Diff3D( 0, 2, 1) }, //NortEast 01335 { Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D( 2, -1, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D( 2, 1, -1), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D( 2, -1, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D( 2, 1, 1) }, //West 01336 { Diff3D(-2, -1, -1), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, 1, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, -1, 1), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, 1, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1) }, //East 01337 { Diff3D( 0, -2, -1), Diff3D( 1, -2, -1), Diff3D( 2, -2, -1), Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D( 2, -1, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D( 2, -2, 0), Diff3D( 0, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, -2, 1), Diff3D( 1, -2, 1), Diff3D( 2, -2, 1), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D( 2, -1, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1) }, //SouthWest 01338 { Diff3D(-1, -2, -1), Diff3D( 0, -2, -1), Diff3D( 1, -2, -1), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D(-1, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, -2, 1), Diff3D( 0, -2, 1), Diff3D( 1, -2, 1), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1) }, //South 01339 { Diff3D(-2, -2, -1), Diff3D(-1, -2, -1), Diff3D( 0, -2, -1), Diff3D(-2, -1, -1), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, -2, 0), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D(-2, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, -2, 1), Diff3D(-1, -2, 1), Diff3D( 0, -2, 1), Diff3D(-2, -1, 1), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1) }, //SouthEast 01340 { Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D( 2, 0, -2), Diff3D( 0, 1, -2), Diff3D( 1, 1, -2), Diff3D( 2, 1, -2), Diff3D( 0, 2, -2), Diff3D( 1, 2, -2), Diff3D( 2, 2, -2), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, 1, -1), Diff3D( 2, 1, -1), Diff3D( 0, 2, -1), Diff3D( 1, 2, -1), Diff3D( 2, 2, -1), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D( 2, 2, 0) }, //Behind-NW 01341 { Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D(-1, 1, -2), Diff3D( 0, 1, -2), Diff3D( 1, 1, -2), Diff3D(-1, 2, -2), Diff3D( 0, 2, -2), Diff3D( 1, 2, -2), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, 1, -1), Diff3D( 1, 1, -1), Diff3D(-1, 2, -1), Diff3D( 0, 2, -1), Diff3D( 1, 2, -1), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0) }, //Behind-N 01342 { Diff3D(-2, 0, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D(-2, 1, -2), Diff3D(-1, 1, -2), Diff3D( 0, 1, -2), Diff3D(-2, 2, -2), Diff3D(-1, 2, -2), Diff3D( 0, 2, -2), Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, 1, -1), Diff3D( 0, 1, -1), Diff3D(-2, 2, -1), Diff3D(-1, 2, -1), Diff3D( 0, 2, -1), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, 2, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0) }, //Behind-NE 01343 { Diff3D( 0, -1, -2), Diff3D( 1, -1, -2), Diff3D( 2, -1, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D( 2, 0, -2), Diff3D( 0, 1, -2), Diff3D( 1, 1, -2), Diff3D( 2, 1, -2), Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D( 2, -1, -1), Diff3D( 0, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D( 2, 1, -1), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0) }, //Behind-W 01344 { Diff3D(-1, -1, -2), Diff3D( 0, -1, -2), Diff3D( 1, -1, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D(-1, 1, -2), Diff3D( 0, 1, -2), Diff3D( 1, 1, -2), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D(-1, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0) }, //Behind 01345 { Diff3D(-2, -1, -2), Diff3D(-1, -1, -2), Diff3D( 0, -1, -2), Diff3D(-2, 0, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D(-2, 1, -2), Diff3D(-1, 1, -2), Diff3D( 0, 1, -2), Diff3D(-2, -1, -1), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D(-2, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, 1, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0) }, //Behind-E 01346 { Diff3D( 0, -2, -2), Diff3D( 1, -2, -2), Diff3D( 2, -2, -2), Diff3D( 0, -1, -2), Diff3D( 1, -1, -2), Diff3D( 2, -1, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D( 2, 0, -2), Diff3D( 0, -2, -1), Diff3D( 1, -2, -1), Diff3D( 2, -2, -1), Diff3D( 0, -1, -1), Diff3D( 2, -1, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D( 2, -2, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0) }, //Behind-SW 01347 { Diff3D(-1, -2, -2), Diff3D( 0, -2, -2), Diff3D( 1, -2, -2), Diff3D(-1, -1, -2), Diff3D( 0, -1, -2), Diff3D( 1, -1, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D(-1, -2, -1), Diff3D( 0, -2, -1), Diff3D( 1, -2, -1), Diff3D(-1, -1, -1), Diff3D( 1, -1, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0) }, //Behind-S 01348 { Diff3D(-2, -2, -2), Diff3D(-1, -2, -2), Diff3D( 0, -2, -2), Diff3D(-2, -1, -2), Diff3D(-1, -1, -2), Diff3D( 0, -1, -2), Diff3D(-2, 0, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D(-2, -2, -1), Diff3D(-1, -2, -1), Diff3D( 0, -2, -1), Diff3D(-2, -1, -1), Diff3D( 0, -1, -1), Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, -2, 0), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0) } //Behind-SE 01349 }; 01350 return d[fromCode][toCode]; 01351 */ 01352 return diff(toCode)-diff(fromCode); 01353 } 01354 01355 /** Equivalent to relativeDiff(static_cast<Direction>(fromCode), static_cast<Direction>(toCode)). 01356 (note: there is no bounds checking on the code you pass.) 01357 */ 01358 static Diff3D const relativeDiff(int fromCode, int toCode) 01359 { 01360 return relativeDiff(static_cast<Direction>(fromCode), static_cast<Direction>(toCode)); 01361 } 01362 01363 /** X-component of diff() */ 01364 static int dX(Direction code) { return diff(code)[0]; } 01365 /** Y-component of diff() */ 01366 static int dY(Direction code) { return diff(code)[1]; } 01367 /** Z-component of diff() */ 01368 static int dZ(Direction code) { return diff(code)[2]; } 01369 01370 /** X-component of diff() */ 01371 static int dX(int code) { return diff(code)[0]; } 01372 /** Y-component of diff() */ 01373 static int dY(int code) { return diff(code)[1]; } 01374 /** Z-component of diff() */ 01375 static int dZ(int code) { return diff(code)[2]; } 01376 01377 /** transform 6-neighborhood code into 26-neighborhood code. 01378 */ 01379 static Direction code(Neighborhood3DSix::Direction d) 01380 { 01381 switch (d){ 01382 case Neighborhood3DSix::InFront : 01383 return InFront; 01384 case Neighborhood3DSix::North : 01385 return North; 01386 case Neighborhood3DSix::West : 01387 return West; 01388 case Neighborhood3DSix::East : 01389 return East; 01390 case Neighborhood3DSix::South : 01391 return South; 01392 case Neighborhood3DSix::Behind : 01393 return Behind; 01394 } 01395 return Error; 01396 } 01397 01398 /** transform Diff3D offset into corresponding direction code. 01399 The code <tt>Direction::Error</tt> will be returned if <tt>diff</tt> 01400 is not in the 3DTwentySix-Neighborhood. 01401 */ 01402 static Direction code(Diff3D const & diff) 01403 { 01404 switch(diff[0]){ 01405 case -1: 01406 switch(diff[1]){ 01407 case -1: 01408 switch(diff[2]){ 01409 case -1: return InFrontNorthWest; // ( -1, -1, -1) 01410 case 0: return NorthWest; // ( -1, -1, 0) 01411 case 1: return BehindNorthWest; // ( -1, -1, 1) 01412 } 01413 case 0: 01414 switch(diff[2]){ 01415 case -1: return InFrontWest; // ( -1, 0, -1) 01416 case 0: return West; // ( -1, 0, 0) 01417 case 1: return BehindWest; // ( -1, 0, 1) 01418 } 01419 case 1: 01420 switch(diff[2]){ 01421 case -1: return InFrontSouthWest; // ( -1, 1, -1) 01422 case 0: return SouthWest; // ( -1, 1, 0) 01423 case 1: return BehindSouthWest; // ( -1, 1, 1) 01424 } 01425 } 01426 case 0: 01427 switch(diff[1]){ 01428 case -1: 01429 switch(diff[2]){ 01430 case -1: return InFrontNorth; // ( 0, 0, -1) 01431 case 0: return North; // ( 0, -1, 0) 01432 case 1: return BehindNorth; // ( 0, -1, 1) 01433 } 01434 case 0: 01435 switch(diff[2]){ 01436 case -1: return InFront; // ( 0, 0, -1) 01437 case 1: return Behind; // ( 0, 0, 1) 01438 } 01439 case 1: 01440 switch(diff[2]){ 01441 case -1: return InFrontSouth; // ( 0, 1, -1) 01442 case 0: return South; // ( 0, 1, 0) 01443 case 1: return BehindSouth; // ( 0, 1, 1) 01444 } 01445 } 01446 case 1: 01447 switch(diff[1]){ 01448 case -1: 01449 switch(diff[2]){ 01450 case -1: return InFrontNorthEast; // ( 1, -1, -1) 01451 case 0: return NorthEast; // ( 1, -1, 0) 01452 case 1: return BehindNorthEast; // ( 1, -1, 1) 01453 } 01454 case 0: 01455 switch(diff[2]){ 01456 case -1: return InFrontEast; // ( 1, 0, -1) 01457 case 0: return East; // ( 1, 0, 0) 01458 case 1: return BehindEast; // ( 1, 0, 1) 01459 } 01460 case 1: 01461 switch(diff[2]){ 01462 case -1: return InFrontSouthEast; // ( 1, 1, -1) 01463 case 0: return SouthEast; // ( 1, 1, 0) 01464 case 1: return BehindSouthEast; // ( 1, 1, 1) 01465 } 01466 } 01467 } 01468 return Error; // better safe than sorry 01469 } 01470 01471 /** Check whether a code refers to a diagonal direction. 01472 Useful if you want to abstract the differences between 6- and 26-neighborhood. 01473 Always <tt>false</tt> for 6-neighborhood. 01474 */ 01475 static bool isDiagonal(Direction dir) { 01476 Diff3D d = diff(dir); 01477 if (abs(d[0])+abs(d[1])+abs(d[2])==1) 01478 return false; 01479 else 01480 return true; 01481 } 01482 01483 static Diff3D const & frontTopLeft() { return diff(InFrontNorthWest); } /**< Offset to the front-top-left neighbor */ 01484 static Diff3D const & frontTop() { return diff(InFrontNorth); } /**< Offset to the front-top neighbor */ 01485 static Diff3D const & frontTopRight() { return diff(InFrontNorthEast); } /**< Offset to the front-top-right neighbor */ 01486 static Diff3D const & frontLeft() { return diff(InFrontWest); } /**< Offset to the front-left neighbor */ 01487 static Diff3D const & front() { return diff(InFront); } /**< Offset to the front neighbor */ 01488 static Diff3D const & frontRight() { return diff(InFrontEast); } /**< Offset to the front-right neighbor */ 01489 static Diff3D const & frontBottomLeft() { return diff(InFrontSouthWest); } /**< Offset to the front-bottom-left neighbor */ 01490 static Diff3D const & frontBottom() { return diff(InFrontSouth); } /**< Offset to the front-bottom neighbor */ 01491 static Diff3D const & frontBottomRight() { return diff(InFrontSouthEast); } /**< Offset to the front-bottom-right neighbor */ 01492 01493 static Diff3D const & topLeft() { return diff(NorthWest); } /**< Offset to the top-left neighbor */ 01494 static Diff3D const & top() { return diff(North); } /**< Offset to the top neighbor */ 01495 static Diff3D const & topRight() { return diff(NorthEast); } /**< Offset to the top-right neighbor */ 01496 static Diff3D const & left() { return diff(West); } /**< Offset to the left neighbor */ 01497 static Diff3D const & right() { return diff(East); } /**< Offset to the right neighbor */ 01498 static Diff3D const & bottomLeft() { return diff(SouthWest); } /**< Offset to the bottom-left neighbor */ 01499 static Diff3D const & bottom() { return diff(South); } /**< Offset to the bottom neighbor */ 01500 static Diff3D const & bottomRight() { return diff(SouthEast); } /**< Offset to the bottom-right neighbor */ 01501 01502 static Diff3D const & rearTopLeft() { return diff(BehindNorthWest); } /**< Offset to the rear-top-left neighbor */ 01503 static Diff3D const & rearTop() { return diff(BehindNorth); } /**< Offset to the rear-top neighbor */ 01504 static Diff3D const & rearTopRight() { return diff(BehindNorthEast); } /**< Offset to the rear-top-right neighbor */ 01505 static Diff3D const & rearLeft() { return diff(BehindWest); } /**< Offset to the rear-left neighbor */ 01506 static Diff3D const & rear() { return diff(Behind); } /**< Offset to the rear neighbor */ 01507 static Diff3D const & rearRight() { return diff(BehindEast); } /**< Offset to the rear-right neighbor */ 01508 static Diff3D const & rearBottomLeft() { return diff(BehindSouthWest); } /**< Offset to the rear-bottom-left neighbor */ 01509 static Diff3D const & rearBottom() { return diff(BehindSouth); } /**< Offset to the rear-bottom neighbor */ 01510 static Diff3D const & rearBottomRight() { return diff(BehindSouthEast); } /**< Offset to the rear-bottom-right neighbor */ 01511 01512 //----- other namings 01513 01514 static Diff3D const & infrontNorthWest() { return diff(InFrontNorthWest); } /**< Offset to the infront-north-west neighbor */ 01515 static Diff3D const & infrontNorth() { return diff(InFrontNorth); } /**< Offset to the infront-north neighbor */ 01516 static Diff3D const & infrontNorthEast() { return diff(InFrontNorthEast); } /**< Offset to the infront-north-east neighbor */ 01517 static Diff3D const & infrontWest() { return diff(InFrontWest); } /**< Offset to the infront-west neighbor */ 01518 static Diff3D const & infront() { return diff(InFront); } /**< Offset to the infront neighbor */ 01519 static Diff3D const & infrontEast() { return diff(InFrontEast); } /**< Offset to the infront-east neighbor */ 01520 static Diff3D const & infrontSouthWest() { return diff(InFrontSouthWest); } /**< Offset to the infront-south-west neighbor */ 01521 static Diff3D const & infrontSouth() { return diff(InFrontSouth); } /**< Offset to the infront-south neighbor */ 01522 static Diff3D const & infrontSouthEast() { return diff(InFrontSouthEast); } /**< Offset to the infront-south-east neighbor */ 01523 01524 static Diff3D const & northWest() { return diff(NorthWest); } /**< Offset to the north-west neighbor */ 01525 static Diff3D const & north() { return diff(North); } /**< Offset to the north neighbor */ 01526 static Diff3D const & northEast() { return diff(NorthEast); } /**< Offset to the north-east neighbor */ 01527 static Diff3D const & west() { return diff(West); } /**< Offset to the west neighbor */ 01528 static Diff3D const & east() { return diff(East); } /**< Offset to the right neighbor */ 01529 static Diff3D const & southWest() { return diff(SouthWest); } /**< Offset to the south-west neighbor */ 01530 static Diff3D const & south() { return diff(South); } /**< Offset to the south neighbor */ 01531 static Diff3D const & southEast() { return diff(SouthEast); } /**< Offset to the south-east neighbor */ 01532 01533 static Diff3D const & behindNorthWest() { return diff(BehindNorthWest); } /**< Offset to the behind-north-west neighbor */ 01534 static Diff3D const & behindNorth() { return diff(BehindNorth); } /**< Offset to the behind-north neighbor */ 01535 static Diff3D const & behindNorthEast() { return diff(BehindNorthEast); } /**< Offset to the behind-north-east neighbor */ 01536 static Diff3D const & behindEast() { return diff(BehindWest); } /**< Offset to the behind-west neighbor */ 01537 static Diff3D const & behind() { return diff(Behind); } /**< Offset to the behind neighbor */ 01538 static Diff3D const & behindWest() { return diff(BehindEast); } /**< Offset to the behind-right neighbor */ 01539 static Diff3D const & behindSouthWest() { return diff(BehindSouthWest); } /**< Offset to the behind-south-west neighbor */ 01540 static Diff3D const & behindSouth() { return diff(BehindSouth); } /**< Offset to the behind-south neighbor */ 01541 static Diff3D const & behindSouthEast() { return diff(BehindSouthEast); } /**< Offset to the behind-south-east neighbor */ 01542 }; // class Neighborhood3D 01543 01544 01545 /** Export NeighborCode3D::Direction into the scope of namespace Neighborhood3DSix. 01546 */ 01547 typedef NeighborCode3D::Direction Direction; 01548 01549 static const Direction InFrontNorthWest = NeighborCode3D::InFrontNorthWest; /**< Export NeighborCode3D::InFrontNorthWest to namespace Neighborhood3DTwentySix */ 01550 static const Direction InFrontNorth = NeighborCode3D::InFrontNorth; /**< Export NeighborCode3D::InFrontNorth to namespace Neighborhood3DTwentySix */ 01551 static const Direction InFrontNorthEast = NeighborCode3D::InFrontNorthEast; /**< Export NeighborCode3D::InFrontNorthEast to namespace Neighborhood3DTwentySix */ 01552 static const Direction InFrontWest = NeighborCode3D::InFrontWest; /**< Export NeighborCode3D::InFrontWest to namespace Neighborhood3DTwentySix */ 01553 static const Direction InFront = NeighborCode3D::InFront; /**< Export NeighborCode3D::InFront to namespace Neighborhood3DTwentySix */ 01554 static const Direction InFrontEast = NeighborCode3D::InFrontEast; /**< Export NeighborCode3D::InFrontEast to namespace Neighborhood3DTwentySix */ 01555 static const Direction InFrontSouthWest = NeighborCode3D::InFrontSouthWest; /**< Export NeighborCode3D::InFrontSouthWest to namespace Neighborhood3DTwentySix */ 01556 static const Direction InFrontSouth = NeighborCode3D::InFrontSouth; /**< Export NeighborCode3D::InFrontSouth to namespace Neighborhood3DTwentySix */ 01557 static const Direction InFrontSouthEast = NeighborCode3D::InFrontSouthEast; /**< Export NeighborCode3D::InFrontSouthEast to namespace Neighborhood3DTwentySix */ 01558 01559 static const Direction NorthWest = NeighborCode3D::NorthWest; /**< Export NeighborCode3D::NorthWest to namespace Neighborhood3DTwentySix */ 01560 static const Direction North = NeighborCode3D::North; /**< Export NeighborCode3D::North to namespace Neighborhood3DTwentySix */ 01561 static const Direction NorthEast = NeighborCode3D::NorthEast; /**< Export NeighborCode3D::NorthEast to namespace Neighborhood3DTwentySix */ 01562 static const Direction West = NeighborCode3D::West; /**< Export NeighborCode3D::West to namespace Neighborhood3DTwentySix */ 01563 static const Direction East = NeighborCode3D::East; /**< Export NeighborCode3D::East to namespace Neighborhood3DTwentySix */ 01564 static const Direction SouthWest = NeighborCode3D::SouthWest; /**< Export NeighborCode3D::SouthWest to namespace Neighborhood3DTwentySix */ 01565 static const Direction South = NeighborCode3D::South; /**< Export NeighborCode3D::South to namespace Neighborhood3DTwentySix */ 01566 static const Direction SouthEast = NeighborCode3D::SouthEast; /**< Export NeighborCode3D::SouthEast to namespace Neighborhood3DTwentySix */ 01567 01568 static const Direction BehindNorthWest = NeighborCode3D::BehindNorthWest; /**< Export NeighborCode3D::BehindNorthWest to namespace Neighborhood3DTwentySix */ 01569 static const Direction BehindNorth = NeighborCode3D::BehindNorth; /**< Export NeighborCode3D::BehindNorth to namespace Neighborhood3DTwentySix */ 01570 static const Direction BehindNorthEast = NeighborCode3D::BehindNorthEast; /**< Export NeighborCode3D::BehindNorthEast to namespace Neighborhood3DTwentySix */ 01571 static const Direction BehindWest = NeighborCode3D::BehindWest; /**< Export NeighborCode3D::BehindWest to namespace Neighborhood3DTwentySix */ 01572 static const Direction Behind = NeighborCode3D::Behind; /**< Export NeighborCode3D::Behind to namespace Neighborhood3DTwentySix */ 01573 static const Direction BehindEast = NeighborCode3D::BehindEast; /**< Export NeighborCode3D::BehindEast to namespace Neighborhood3DTwentySix */ 01574 static const Direction BehindSouthWest = NeighborCode3D::BehindSouthWest; /**< Export NeighborCode3D::BehindSouthWest to namespace Neighborhood3DTwentySix */ 01575 static const Direction BehindSouth = NeighborCode3D::BehindSouth; /**< Export NeighborCode3D::BehindSouth to namespace Neighborhood3DTwentySix */ 01576 static const Direction BehindSouthEast = NeighborCode3D::BehindSouthEast; /**< Export NeighborCode3D::BehindSouthEast to namespace Neighborhood3DTwentySix */ 01577 01578 static const Direction DirectionCount = NeighborCode3D::DirectionCount; /**< Export NeighborCode3D::DirectionCount to namespace Neighborhood3DTwentySix */ 01579 01580 }//namespace Neighborhood3DTwentySix 01581 01582 /** Export \ref vigra::Neighborhood3DTwentySix::NeighborCode3D into the scope of namespace vigra. 01583 */ 01584 typedef Neighborhood3DTwentySix::NeighborCode3D NeighborCode3DTwentySix; 01585 01586 //@} 01587 01588 } // namespace vigra 01589 01590 #endif /* VIGRA_VOXELNEIGHBORHOOD_HXX */
© Ullrich Köthe (ullrich.koethe@iwr.uni-heidelberg.de) |
html generated using doxygen and Python
|