18 #ifndef __otbFuzzyVariable_txx
19 #define __otbFuzzyVariable_txx
28 template <
class TLabel,
class TPrecision>
32 template <
class TLabel,
class TPrecision>
41 if( v1>v2 || v2>v3 || v3>v4)
42 itkExceptionMacro(<<
"Values have to be v1<=v2<=v3<=v4");
50 parameters[4] =
static_cast<TPrecision
>(0);
51 parameters[5] =
static_cast<TPrecision
>(1);
54 m_MembershipFunctions[var]=parameters;
60 template <
class TLabel,
class TPrecision>
71 if( v1>v2 || v2>v3 || v3>v4)
72 itkExceptionMacro(<<
"Values have to be v1<=v2<=v3<=v4");
74 itkExceptionMacro(<<
"Values have to be min<max");
86 m_MembershipFunctions[var]=parameters;
92 template <
class TLabel,
class TPrecision>
98 m_MembershipFunctions.erase(var);
104 template <
class TLabel,
class TPrecision>
110 m_MembershipFunctions.clear();
117 template <
class TLabel,
class TPrecision>
124 PrecisionType output = itk::NumericTraits<PrecisionType>::Zero;
127 typename ParametersMapType::const_iterator mapIt = m_MembershipFunctions.find(var);
130 if(mapIt!=m_MembershipFunctions.end())
136 if( value < parameters[0] || value > parameters[3] )
138 output = parameters[4];
140 else if( value >= parameters[0]
141 && value < parameters[1] )
143 if(parameters[1]>parameters[0])
145 output =
static_cast<TPrecision
>((value - parameters[0])
146 /(parameters[1] - parameters[0])
147 *(parameters[5] - parameters[4]));
151 output = parameters[5];
155 if( value >= parameters[1]
156 && value < parameters[2] )
158 output = parameters[5];
161 if( value >= parameters[2]
162 && value < parameters[3] )
164 if(parameters[3]>parameters[2])
166 output =
static_cast<TPrecision
>((parameters[3] - value)
167 /(parameters[3] - parameters[2])
168 *(parameters[5] - parameters[4]));
172 output = parameters[5];
182 template <
class TLabel,
class TPrecision>
184 ::MembershipValueType
192 for(
typename ParametersMapType::const_iterator mapIt = m_MembershipFunctions.begin();
193 mapIt!=m_MembershipFunctions.end(); ++mapIt)
196 output[mapIt->first] = this->GetMembership(mapIt->first, value);
203 template <
class TLabel,
class TPrecision>
210 if(m_MembershipFunctions.empty())
212 itkExceptionMacro(<<
"Membership parameters map is empty");
219 typename MembershipValueType::const_iterator mapIt = memberships.begin();
226 while(mapIt!=memberships.end())
228 if(mapIt->second > higherVal)
230 higherVal = mapIt->second;
231 higherVar = mapIt->first;
240 template <
class TLabel,
class TPrecision>
245 Superclass::PrintSelf(os, indent);
248 template <
class TLabel,
class TPrecision>
255 typedef std::map<TLabel, TPrecision> LabelMapType;
256 typename LabelMapType::const_iterator it = labelMap.begin();
262 while(it != labelMap.end())
264 out<<it->first<<
" : "<<it->second;
266 if(it != labelMap.end())