cmtkVolume.cxx

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2010 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: 2022 $
00026 //
00027 //  $LastChangedDate: 2010-07-21 15:26:03 -0700 (Wed, 21 Jul 2010) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #include "cmtkVolume.h"
00034 
00035 namespace
00036 cmtk
00037 {
00038 
00041 
00042 bool
00043 Volume::GetTrilinear
00044 ( ProbeInfo& probeInfo, const int X, const int Y, const int Z,
00045   const Vector3D& Location, const Types::Coordinate* from, 
00046   const Types::Coordinate* to ) const
00047 {
00048   const TypedArray* data = this->GetData();
00049 
00050   int offset = X+this->m_Dims[0]*(Y+this->m_Dims[1]*Z);
00051 
00052   bool data_present = data->Get( probeInfo.Values[0], offset );
00053   
00054   if ( X<this->m_Dims[0]-1 ) 
00055     {
00056     data_present &= data->Get( probeInfo.Values[1], offset+nextI );
00057     
00058     if ( Y<this->m_Dims[1]-1 ) 
00059       {
00060       data_present &= data->Get( probeInfo.Values[3], offset+nextIJ );
00061       
00062       if ( Z<this->m_Dims[2]-1 )
00063         data_present &= data->Get( probeInfo.Values[7], offset+nextIJK );
00064       }
00065     if ( Z<this->m_Dims[2]-1 )
00066       data_present &= data->Get( probeInfo.Values[5], offset+nextIK );
00067     }
00068   
00069   if ( Y<this->m_Dims[1]-1 ) 
00070     {
00071     data_present &= data->Get( probeInfo.Values[2], offset+nextJ );
00072     
00073     if ( Z<this->m_Dims[2]-1 )
00074       data_present &= data->Get( probeInfo.Values[6], offset+nextJK );
00075     }
00076   
00077   if ( Z<this->m_Dims[2]-1 )
00078     data_present &= data->Get( probeInfo.Values[4], offset+nextK );
00079   
00080   if (data_present)
00081     {
00082     for ( int i=0; i<3; ++i ) 
00083       {
00084       probeInfo.Deltas[i] = 1.0/(to[i]-from[i]);
00085       
00086       probeInfo.Offsets[i] = 1- (probeInfo.Offsets[3+i] = probeInfo.Deltas[i]*(Location[i]-from[i]) );
00087       }
00088     
00089     probeInfo.Location = Location;
00090     
00091     return true;
00092     }
00093   
00094   return false;
00095 }
00096 
00097 Vector3D
00098 Volume::GetCenter () const 
00099 {
00100   return this->m_Offset + 0.5 * Vector3D(Size);
00101 }
00102 
00103 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines