[ 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> <<a href="voxelneighborhood_8hxx-source.html">vigra/voxelneighborhood.hxx</a>><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> <<a href="voxelneighborhood_8hxx-source.html">vigra/voxelneighborhood.hxx</a>><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},
    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) Heidelberg Collaboratory for Image Processing, University of Heidelberg, Germany | html generated using doxygen and Python vigra 1.7.1 (3 Dec 2010)