cmtkAnatomicalOrientationBase.cxx

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2010 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2479 $
00026 //
00027 //  $LastChangedDate: 2010-10-20 15:35:37 -0700 (Wed, 20 Oct 2010) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #include "cmtkAnatomicalOrientationBase.h"
00034 
00035 #include <cassert>
00036 #include <stdlib.h>
00037 
00038 namespace
00039 cmtk
00040 {
00041 
00044 
00045 const char *const AnatomicalOrientationBase::ORIENTATION_STANDARD = "RAS";
00046 
00047 const char *const AnatomicalOrientationBase::SPACE_CMTK = "RAS";
00048 const char *const AnatomicalOrientationBase::SPACE_ITK = "LPS";
00049 
00050 const char* 
00051 AnatomicalOrientationBase
00052 ::GetClosestOrientation( const char* desiredOrientation, const char *const availableOrientations[] )
00053 {
00054   const char* result = NULL;
00055   int minPenalty = 100;
00056 
00057   const char *const *next = availableOrientations;
00058   while ( *next )
00059     {
00060     int penalty = 0;
00061     for ( int axis = 0; axis < 3; ++axis )
00062       {
00063       if ( desiredOrientation[axis] != (*next)[axis] )
00064         {
00065         if ( Self::OnSameAxis( desiredOrientation[axis], (*next)[axis] ) )
00066           penalty += 1;
00067         else
00068           penalty += 4;
00069         }
00070       }
00071 
00072     if ( penalty < minPenalty )
00073       {
00074       result = *next;
00075       minPenalty = penalty;
00076       }
00077 
00078     ++next;
00079     }
00080   return result;
00081 }
00082 
00083 bool
00084 AnatomicalOrientationBase::OnSameAxis( const char from, const char to )
00085 {
00086   // Set up lists such that the direction corresponding to the 
00087   // character at index "from-'A'" is the character that represents
00088   // the same axis in reverse direction. Lowercase characters are
00089   // for padding and orientation.
00090 
00091   assert( (from=='A') || (from=='P') || (from=='L') || (from=='R') || (from=='I') || (from=='S') );
00092   assert( (to=='A') || (to=='P') || (to=='L') || (to=='R') || (to=='I') || (to=='S') );
00093 
00094   return (Self::OppositeDirection( from ) == to);
00095 }
00096 
00097 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines