OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossim2dTo2dMatrixTransform.cpp
Go to the documentation of this file.
1 //----------------------------------------------------------------------------
2 //
3 // License: LGPL
4 //
5 // See LICENSE.txt file in the top level directory for more details.
6 //
7 // Author:
8 //
9 // Description:
10 //
11 //----------------------------------------------------------------------------
12 // $Id$
13 
17 #include <iostream>
18 RTTI_DEF1(ossim2dTo2dMatrixTransform, "ossim2dTo2dMatrixTransform", ossim2dTo2dTransform);
20 {
21  std::fill(m_coefficientsXTerm, m_coefficientsXTerm+4, 0.0);
22  std::fill(m_coefficientsYTerm, m_coefficientsYTerm+4, 0.0);
25 
26  // setup identity
27  //
28  m_coefficientsXTerm[1] = 1.0;
29  m_coefficientsYTerm[2] = 1.0;
32 }
33 
36 {
41 }
42 
43 void ossim2dTo2dMatrixTransform::setFromPoints(const ossimDpt& in1, const ossimDpt& in2, const ossimDpt& in3, const ossimDpt& in4,
44  const ossimDpt& out1, const ossimDpt& out2, const ossimDpt& out3, const ossimDpt& out4)
45 {
46  ossimDpt input[4];
47  ossimDpt output[4];
48 
49  input[0] = in1;
50  input[1] = in2;
51  input[2] = in3;
52  input[3] = in4;
53 
54  output[0] = out1;
55  output[1] = out2;
56  output[2] = out3;
57  output[3] = out4;
58 
59  setFromPoints(&input[0], &output[0], 4);
60 }
61 
63  const ossimDpt* output,
64  ossim_uint32 arraySize)
65 {
67  ossimLeastSquaresBilin inversex;
69  ossimLeastSquaresBilin inversey;
70  ossim_uint32 idx = 0;
71  for(idx=0; idx < arraySize; ++idx)
72  {
73  inx.addSample(input[idx].x, input[idx].y, output[idx].x);
74  inversex.addSample(output[idx].x, output[idx].y, input[idx].x);
75  iny.addSample(input[idx].x, input[idx].y, output[idx].y);
76  inversey.addSample(output[idx].x, output[idx].y, input[idx].y);
77  }
78  inx.solveLS();
79  inversex.solveLS();
80  iny.solveLS();
81  inversey.solveLS();
86 }
87 
89  const char* prefix)const
90 {
107 
108  kwl.add(prefix, "xterm", xterm, true);
109  kwl.add(prefix, "yterm", yterm, true);
110  kwl.add(prefix, "inverse_xterm", inverse_xterm, true);
111  kwl.add(prefix, "inverse_yterm", inverse_yterm, true);
112  return ossim2dTo2dTransform::saveState(kwl, prefix);
113 }
114 
116  const char* prefix)
117 {
118  bool result = true;
119  ossimString xterm = kwl.find(prefix, "xterm");
120  ossimString yterm = kwl.find(prefix, "yterm");
121  ossimString inverse_xterm = kwl.find(prefix, "inverse_xterm");
122  ossimString inverse_yterm = kwl.find(prefix, "inverse_yterm");
123 
124  std::vector<ossimString> values;
125  xterm.split(values, " ");
126  if(values.size() == 4)
127  {
128  m_coefficientsXTerm[0] = values[0].toDouble();
129  m_coefficientsXTerm[1] = values[1].toDouble();
130  m_coefficientsXTerm[2] = values[2].toDouble();
131  m_coefficientsXTerm[3] = values[3].toDouble();
132  }
133  else
134  {
135  result = false;
136  }
137  values.clear();
138  yterm.split(values, " ");
139  if(values.size() == 4)
140  {
141  m_coefficientsYTerm[0] = values[0].toDouble();
142  m_coefficientsYTerm[1] = values[1].toDouble();
143  m_coefficientsYTerm[2] = values[2].toDouble();
144  m_coefficientsYTerm[3] = values[3].toDouble();
145  }
146  else
147  {
148  result = false;
149  }
150  values.clear();
151  inverse_xterm.split(values, " ");
152  if(values.size() == 4)
153  {
154  m_inverseCoefficientsXTerm[0] = values[0].toDouble();
155  m_inverseCoefficientsXTerm[1] = values[1].toDouble();
156  m_inverseCoefficientsXTerm[2] = values[2].toDouble();
157  m_inverseCoefficientsXTerm[3] = values[3].toDouble();
158  }
159  else
160  {
161  result = false;
162  }
163  values.clear();
164  inverse_yterm.split(values, " ");
165  if(values.size() == 4)
166  {
167  m_inverseCoefficientsYTerm[0] = values[0].toDouble();
168  m_inverseCoefficientsYTerm[1] = values[1].toDouble();
169  m_inverseCoefficientsYTerm[2] = values[2].toDouble();
170  m_inverseCoefficientsYTerm[3] = values[3].toDouble();
171  }
172  else
173  {
174  result = false;
175  }
176 
177  if(result)
178  {
179  result = ossim2dTo2dTransform::loadState(kwl, prefix);
180  }
181 
182  return result;
183 }
ossim_uint32 x
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
RTTI_DEF1(ossim2dTo2dMatrixTransform, "ossim2dTo2dMatrixTransform", ossim2dTo2dTransform)
virtual void addSample(double x, double yy, double zmea)
add a single data sample.
Represents serializable keyword/value map.
ossim_uint32 y
const char * find(const char *key) const
static ossimString toString(bool aValue)
Numeric to string methods.
void setFromPoints(const ossimDpt &in1, const ossimDpt &in2, const ossimDpt &in3, const ossimDpt &in4, const ossimDpt &out1, const ossimDpt &out2, const ossimDpt &out3, const ossimDpt &out4)
Mapping 4 corners to an output 4 corners.
void split(std::vector< ossimString > &result, const ossimString &separatorList, bool skipBlankFields=false) const
Splits this string into a vector of strings (fields) using the delimiter list specified.
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
ossim2dTo2dMatrixTransform()
Initialize to the identity.
unsigned int ossim_uint32
Provide 2D Least Squares Bilinear model fitting The math model is that of a bilinear surface of the ...
virtual bool getLSParms(double &pa, double &pb_x, double &pc_y, double &pd_xy) const
return LS solution parameters.
ossim2dTo2dMatrixTransform allows one to specify a set of input points and output points and will fit...
bool solveLS()
compute least squares parameter solution - true if succesfull.
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
loads the state of this object from a keywordlist.
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Saves the state of this object.