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