00001 /*========================================================================= 00002 00003 Program: F.R.E.E. - flexible registration evaluation engine 00004 Version: v.1.0.0 00005 Date: $Date: 2006/09/01 12:00:00 $ 00006 Module: $RCSfile: freSVLimitedAxisVnlSOMetricAdaptor.cxx,v $ 00007 Language: C++ 00008 00009 00010 00011 Copyright (c) 2007 Ralf o Floca (Department of Medical Informatics, 00012 Institute for Medical Biometry and Informatics, University of Heidelberg, 00013 Germany). All rights reserved. 00014 See FREECopyright.txt or http://www.mi.med.uni-hd.de/free/copyright.htm 00015 for details. 00016 00017 This software is distributed WITHOUT ANY WARRANTY; without even 00018 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00019 PURPOSE. See the above copyright notices for more information. 00020 00021 =========================================================================*/ 00022 00023 #include "freSVLimitedAxisVnlSOMetricAdaptor.h" 00024 00025 namespace FREE 00026 { 00027 00028 void 00029 SVLimitedAxisVnlSOMetricAdaptor 00030 ::SetOriginPosition(const OriginPositionType& origin) 00031 { 00032 m_OriginPosition = origin; 00033 }; 00034 00035 void 00036 SVLimitedAxisVnlSOMetricAdaptor 00037 ::SetParameterAxis(const ParameterAxisType& axis) 00038 { 00039 m_ParameterAxis = axis; 00040 }; 00041 00043 SVLimitedAxisVnlSOMetricAdaptor 00044 ::SVLimitedAxisVnlSOMetricAdaptor(unsigned int spaceDimension, unsigned int axisCount): 00045 SingleValuedVnlSOMetricAdaptor(spaceDimension), m_ParameterAxis(spaceDimension), 00046 m_OriginPosition(spaceDimension) 00047 { 00048 m_Scales.SetSize(spaceDimension); 00049 m_Scales.Fill(1); 00050 m_ParameterAxis.Fill(-1); 00051 m_OriginPosition.Fill(0.0); 00052 m_NumberOfAxis = axisCount; 00053 } 00054 00055 SVLimitedAxisVnlSOMetricAdaptor::ParametersType 00056 SVLimitedAxisVnlSOMetricAdaptor:: 00057 ConvertInternalToParameter(const InternalParametersType & inparameters) 00058 { 00059 // default scaling for any parameter is 1 00060 ParametersType parameters(this->get_number_of_unknowns()); 00061 for(unsigned int i=0;i<parameters.size();i++) 00062 { 00063 int iAxisIndex = m_ParameterAxis[i]; 00064 if (iAxisIndex<0) iAxisIndex = i; 00065 00066 if (iAxisIndex>=inparameters.size()) throwExceptionMacro("Error: axis index exceeds internal parameter set. Index: " << iAxisIndex << "; size: " << inparameters.size()); 00067 00068 parameters[i] = m_OriginPosition[i] + (inparameters[iAxisIndex]*m_Scales[i]); 00069 } 00070 00071 return parameters; 00072 }; 00073 00074 SVLimitedAxisVnlSOMetricAdaptor::InternalParametersType 00075 SVLimitedAxisVnlSOMetricAdaptor:: 00076 ConvertParameterToInternal(const ParametersType & parameters) 00077 { 00078 InternalParametersType inparameters(m_NumberOfAxis); 00079 inparameters.fill(0.0); 00080 00081 for(unsigned int i=0;i<parameters.size();i++) 00082 { 00083 int iAxisIndex = m_ParameterAxis[i]; 00084 if (iAxisIndex<0) iAxisIndex = i; 00085 00086 if (iAxisIndex>=inparameters.size()) throwExceptionMacro("Error: axis index exceeds internal parameter set. Index: " << iAxisIndex << "; size: " << inparameters.size()); 00087 00088 //It is possible that an inparameter value will be overwritten 00089 //if there are more then one parameter on one axis. Then the last one 00090 //is the one used, hence the difference between the computed versions 00091 //should be minor. 00092 inparameters[iAxisIndex] = (parameters[i] - m_OriginPosition[i])/m_Scales[i]; 00093 } 00094 00095 return inparameters; 00096 }; 00097 00098 } // end namespace itk 00099 00100 00101 00102 00103
1.5.3 written by Dimitri van Heesch,
© 1997-2000