OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossim2dBilinearTransform.cpp
Go to the documentation of this file.
4 #include <iostream>
5 RTTI_DEF1(ossim2dBilinearTransform, "ossim2dBilinearTransform", ossim2dTo2dTransform);
7 {
8  std::fill(m_coefficientsXTerm, m_coefficientsXTerm+4, 0.0);
9  std::fill(m_coefficientsYTerm, m_coefficientsYTerm+4, 0.0);
12 
13  // setup identity
14  //
15  m_coefficientsXTerm[1] = 1.0;
16  m_coefficientsYTerm[2] = 1.0;
19 }
20 
23 {
28 }
29 
30 void ossim2dBilinearTransform::setFromPoints(const ossimDpt& in1, const ossimDpt& in2, const ossimDpt& in3, const ossimDpt& in4,
31  const ossimDpt& out1, const ossimDpt& out2, const ossimDpt& out3, const ossimDpt& out4)
32 {
33  ossimDpt input[4];
34  ossimDpt output[4];
35 
36  input[0] = in1;
37  input[1] = in2;
38  input[2] = in3;
39  input[3] = in4;
40 
41  output[0] = out1;
42  output[1] = out2;
43  output[2] = out3;
44  output[3] = out4;
45 
46  setFromPoints(&input[0], &output[0], 4);
47 }
48 
50  const ossimDpt* output,
51  ossim_uint32 arraySize)
52 {
54  ossimLeastSquaresBilin inversex;
56  ossimLeastSquaresBilin inversey;
57  ossim_uint32 idx = 0;
58  for(idx=0; idx < arraySize; ++idx)
59  {
60  inx.addSample(input[idx].x, input[idx].y, output[idx].x);
61  inversex.addSample(output[idx].x, output[idx].y, input[idx].x);
62  iny.addSample(input[idx].x, input[idx].y, output[idx].y);
63  inversey.addSample(output[idx].x, output[idx].y, input[idx].y);
64  }
65  inx.solveLS();
66  inversex.solveLS();
67  iny.solveLS();
68  inversey.solveLS();
73 }
74 
76  const char* prefix)const
77 {
94 
95  kwl.add(prefix, "xterm", xterm, true);
96  kwl.add(prefix, "yterm", yterm, true);
97  kwl.add(prefix, "inverse_xterm", inverse_xterm, true);
98  kwl.add(prefix, "inverse_yterm", inverse_yterm, true);
99  return ossim2dTo2dTransform::saveState(kwl, prefix);
100 }
101 
103  const char* prefix)
104 {
105  bool result = true;
106  ossimString xterm = kwl.find(prefix, "xterm");
107  ossimString yterm = kwl.find(prefix, "yterm");
108  ossimString inverse_xterm = kwl.find(prefix, "inverse_xterm");
109  ossimString inverse_yterm = kwl.find(prefix, "inverse_yterm");
110 
111  std::vector<ossimString> values;
112  xterm.split(values, " ");
113  if(values.size() == 4)
114  {
115  m_coefficientsXTerm[0] = values[0].toDouble();
116  m_coefficientsXTerm[1] = values[1].toDouble();
117  m_coefficientsXTerm[2] = values[2].toDouble();
118  m_coefficientsXTerm[3] = values[3].toDouble();
119  }
120  else
121  {
122  result = false;
123  }
124  values.clear();
125  yterm.split(values, " ");
126  if(values.size() == 4)
127  {
128  m_coefficientsYTerm[0] = values[0].toDouble();
129  m_coefficientsYTerm[1] = values[1].toDouble();
130  m_coefficientsYTerm[2] = values[2].toDouble();
131  m_coefficientsYTerm[3] = values[3].toDouble();
132  }
133  else
134  {
135  result = false;
136  }
137  values.clear();
138  inverse_xterm.split(values, " ");
139  if(values.size() == 4)
140  {
141  m_inverseCoefficientsXTerm[0] = values[0].toDouble();
142  m_inverseCoefficientsXTerm[1] = values[1].toDouble();
143  m_inverseCoefficientsXTerm[2] = values[2].toDouble();
144  m_inverseCoefficientsXTerm[3] = values[3].toDouble();
145  }
146  else
147  {
148  result = false;
149  }
150  values.clear();
151  inverse_yterm.split(values, " ");
152  if(values.size() == 4)
153  {
154  m_inverseCoefficientsYTerm[0] = values[0].toDouble();
155  m_inverseCoefficientsYTerm[1] = values[1].toDouble();
156  m_inverseCoefficientsYTerm[2] = values[2].toDouble();
157  m_inverseCoefficientsYTerm[3] = values[3].toDouble();
158  }
159  else
160  {
161  result = false;
162  }
163 
164  if(result)
165  {
166  result = ossim2dTo2dTransform::loadState(kwl, prefix);
167  }
168 
169  return result;
170 }
ossim_uint32 x
RTTI_DEF1(ossim2dBilinearTransform, "ossim2dBilinearTransform", ossim2dTo2dTransform)
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
virtual void addSample(double x, double yy, double zmea)
add a single data sample.
Represents serializable keyword/value map.
ossim_float64 m_inverseCoefficientsXTerm[4]
ossim_uint32 y
const char * find(const char *key) const
static ossimString toString(bool aValue)
Numeric to string methods.
ossim2dBilinearTransform()
Initialize to the identity.
ossim_float64 m_inverseCoefficientsYTerm[4]
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)
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.
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
loads the state of this object from a keywordlist.
bool solveLS()
compute least squares parameter solution - true if succesfull.
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.
ossim2dBilinearTransform allows one to specify a set of input points and output points and will fit a...
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Saves the state of this object.