AnimatLab  2
Test
StdLookupTable.cpp
Go to the documentation of this file.
1 
7 #include "StdAfx.h"
8 
9 
10 namespace StdUtils
11 {
12 
20 {
21  m_iTableSize = 0;
22  m_dblDelta = 0;
23  m_dblStartX = 0;
24  m_dblEndX = 0;
25  m_aryM = NULL;
26  m_aryB = NULL;
27 
28  m_bUseLowLimitValue = true;
29  m_bUseHighLimitValue = true;
32 }
33 
41 {
42  try
43  {
44  Clear();
45  }
46  catch(...)
47  {Std_TraceMsg(0, "Caught Error in desctructor of CStdLookupTable\r\n", "", -1, false, true);}
48 }
49 
57 {
58  if(m_aryM)
59  delete [] m_aryM;
60 
61  if(m_aryB)
62  delete [] m_aryB;
63 
64  m_aryInitialPoints.RemoveAll();
65 }
66 
76 void CStdLookupTable::AddPoint(double dblX, double dblY)
77 {
78  CStdDPoint oPoint(dblX, dblY, 0);
79  m_aryInitialPoints.Add(oPoint);
80 }
81 
93 bool CompareDataPoints(CStdDPoint oPoint1, CStdDPoint oPoint2)
94 {
95  if(oPoint1.x<oPoint2.x)
96  return true;
97  else
98  return false;
99 }
100 
108 {
109  if(m_aryInitialPoints.GetSize() <= 1)
110  THROW_ERROR(Std_Err_lNotEnoughPointsInLookupTable, Std_Err_strNotEnoughPointsInLookupTable);
111 
112 #if defined(STD_TRACING_ON)
113  TracePointArray(m_aryInitialPoints, "Unsorted LookupTable Points");
114 #endif
115 
116  //First sort the initial points.
117  stable_sort(m_aryInitialPoints.begin(), m_aryInitialPoints.end(), CompareDataPoints);
118 
119 #if defined(STD_TRACING_ON)
120  TracePointArray(m_aryInitialPoints, "Sorted LookupTable Points");
121 #endif
122 
123  //Now make sure that there are not two points with the same x value, and find the minimum delta
124  double dblMin = -1, dblDelta;
125  int iCount = m_aryInitialPoints.GetSize(), iIndex;
126  CStdDPoint oFirst, oSecond;
127  for(iIndex=1; iIndex<iCount; iIndex++)
128  {
129  oFirst = m_aryInitialPoints[iIndex-1];
130  oSecond = m_aryInitialPoints[iIndex];
131 
132  if(oFirst.x == oSecond.x)
133  THROW_PARAM_ERROR(Std_Err_lOverlappingLookupTablePoints, Std_Err_strOverlappingLookupTablePoints, "X", oFirst.x);
134 
135  dblDelta = oSecond.x - oFirst.x;
136  if(dblMin == -1 || dblDelta < dblMin)
137  dblMin = dblDelta;
138  }
139 
140  //Create the tables
141  m_dblDelta = dblMin;
145 
146  if(m_aryM)
147  delete [] m_aryM;
148  if(m_aryB)
149  delete [] m_aryB;
150 
151  m_aryM = new double[m_iTableSize];
152  m_aryB = new double[m_iTableSize];
153 
154  //Now fill the tables with the line equations for each segment.
155  double dblX = m_dblStartX;
156  int iInitPointIndex=1, iInitPointTotal = m_aryInitialPoints.GetSize();
157  oFirst = m_aryInitialPoints[0];
158  oSecond = m_aryInitialPoints[1];
159  for(iIndex=1; iIndex<m_iTableSize; iIndex++)
160  {
161  m_aryM[iIndex] = (oSecond.y - oFirst.y) / (oSecond.x - oFirst.x);
162  m_aryB[iIndex] = oSecond.y - m_aryM[iIndex]*oSecond.x;
163 
164  dblX += m_dblDelta;
165 
166  if( (dblX > oSecond.x) || (dblX < oSecond.x && fabs(oSecond.x-dblX) < 0.0001) )
167  {
168  if(iInitPointIndex<iInitPointTotal)
169  {
170  iInitPointIndex++;
171  oFirst = m_aryInitialPoints[iInitPointIndex-1];
172  oSecond = m_aryInitialPoints[iInitPointIndex];
173  }
174  }
175  }
176 
177  m_aryM[0] = m_aryM[1];
178  m_aryB[0] = m_aryB[1];
179 }
180 
191 double CStdLookupTable::Evaluate(double dblX)
192 {
193  int iIndex;
194 
195  if(dblX < m_dblStartX)
196  {
198  return m_dblLowLimitValue;
199 
200  iIndex = 0;
201  }
202  else if(dblX > m_dblEndX)
203  {
205  return m_dblLowLimitValue;
206 
207  iIndex = 0;
208  }
209  else
210  {
211  iIndex = (int) ((dblX - m_dblStartX)/ m_dblDelta);
212  if(iIndex >= m_iTableSize)
213  iIndex = m_iTableSize-1;
214  }
215 
216  double dblVal = m_aryM[iIndex]*dblX + m_aryB[iIndex];
217  return dblVal;
218 }
219 
230 void CStdLookupTable::Load(CStdXml &oXml, std::string strParamName, bool bThrowError)
231 {
232  if(oXml.FindChildElement(strParamName, bThrowError))
233  {
234  m_aryInitialPoints.RemoveAll();
235 
236  oXml.IntoElem(); //Into LookupTable Element
237  int iCount = oXml.NumberOfChildren();
238 
239  CStdDPoint oPoint;
240  for(int iIndex=0; iIndex<iCount; iIndex++)
241  {
242  Std_LoadPoint(oXml, iIndex, oPoint);
243  m_aryInitialPoints.Add(oPoint);
244  }
245 
246  m_bUseLowLimitValue = (bool) oXml.GetChildBool("UseLowLimitValue", m_bUseLowLimitValue);
247  m_bUseHighLimitValue = (bool) oXml.GetChildBool("UseHighLimitValue", m_bUseHighLimitValue);
248  m_dblLowLimitValue = oXml.GetChildDouble("LowLimitValue", m_dblLowLimitValue);
249  m_dblHighLimitValue = oXml.GetChildDouble("HighLimitValue", m_dblHighLimitValue);
250 
251  oXml.OutOfElem(); //OutOf LookupTable Element
252  }
253 }
254 
264 void CStdLookupTable::Save(CStdXml &oXml, std::string strParamName)
265 {
266 }
267 
268 } //StdUtils
virtual void Load(CStdXml &oXml, std::string strParamName, bool bThrowError=false)
Loads the lookup table.
void Clear()
Clears this lookup table.
virtual bool FindChildElement(std::string strElementName, bool fThrowError=true)
Finds a child element by name.
Definition: StdXml.cpp:256
double m_dblDelta
The delta.
double m_dblHighLimitValue
The double high limit value.
CStdArray< CStdDPoint > m_aryInitialPoints
The initial points for the lines.
bool CompareDataPoints(CStdDPoint oPoint1, CStdDPoint oPoint2)
Compare data points.
double * m_aryM
The array of slopes.
virtual bool IntoElem()
Goes into the next element where the cursor is located.
Definition: StdXml.cpp:42
int m_iTableSize
Size of the table.
virtual double GetChildDouble(std::string strElementName)
Gets a double value from the element with the specified name.
Definition: StdXml.cpp:538
CStdLookupTable()
Default constructor.
double Evaluate(double dblX)
Evaluates a x value to get the calculated y value.
virtual ~CStdLookupTable()
Destructor.
A standard xml manipulation class.
Definition: StdXml.h:19
double * m_aryB
The array of intercepts.
Namespace for the standard utility objects.
Definition: MarkupSTL.cpp:19
double m_dblLowLimitValue
The double low limit value.
void Std_TraceMsg(const int iLevel, std::string strMessage, std::string strSourceFile, int iSourceLine, bool bLogToFile, bool bPrintHeader)
Traces a message to the debugger window.
virtual bool GetChildBool(std::string strElementName)
Gets a bool value from the element with the specified name.
Definition: StdXml.cpp:699
double m_dblEndX
The end x coordinate.
virtual void Save(CStdXml &oXml, std::string strParamName)
Saves this lookup table..
virtual int NumberOfChildren()
Gets the number of children of the current element.
Definition: StdXml.cpp:202
virtual bool OutOfElem()
Goes out of the element where the cursor is located.
Definition: StdXml.cpp:56
bool m_bUseLowLimitValue
true to use low limit value
bool Std_LoadPoint(CStdXml &oXml, std::string strName, CStdIPoint &oPoint, bool bThrowError)
Standard load point.
bool m_bUseHighLimitValue
true to use high limit value
void AddPoint(double dblX, double dblY)
Adds a point to the initial points.
void Initialize()
Initializes this lookup table.
double m_dblStartX
The start x coordinate.