OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossim2dTo2dMatrixTransform.h
Go to the documentation of this file.
1 //----------------------------------------------------------------------------
2 //
3 // License: MIT
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 #ifndef ossim2dTo2dMatrixTransform_HEADER
14 #define ossim2dTo2dMatrixTransform_HEADER 1
15 
17 #include <algorithm>
18 
30 {
31 public:
32 
37 
48  const ossimDpt* output,
49  ossim_uint32 arraySize)
50  {
51  setFromPoints(input, output, arraySize);
52  }
53 
58  ossim2dTo2dMatrixTransform(const ossimDpt& in1, const ossimDpt& in2, const ossimDpt& in3, const ossimDpt& in4,
59  const ossimDpt& out1, const ossimDpt& out2, const ossimDpt& out3, const ossimDpt& out4)
60  {
61  setFromPoints(in1, in2, in3, in4, out1, out2, out3, out4);
62  }
63 
68 
72  virtual ossimObject* dup()const{return new ossim2dTo2dMatrixTransform(*this);}
73 
81  {
82  if(this == &src) return *this;
83 
84  ossim2dTo2dTransform::operator =(*this); // call base classes equal operator
85  std::copy(src.m_coefficientsXTerm, src.m_coefficientsXTerm+4, m_coefficientsXTerm);
86  std::copy(src.m_coefficientsYTerm, src.m_coefficientsYTerm+4, m_coefficientsYTerm);
87  std::copy(src.m_inverseCoefficientsXTerm, src.m_inverseCoefficientsXTerm+4, m_inverseCoefficientsXTerm);
88  std::copy(src.m_inverseCoefficientsYTerm, src.m_inverseCoefficientsYTerm+4, m_inverseCoefficientsYTerm);
89 
90  return *this;
91  }
92 
97  void setFromPoints(const ossimDpt& in1, const ossimDpt& in2, const ossimDpt& in3, const ossimDpt& in4,
98  const ossimDpt& out1, const ossimDpt& out2, const ossimDpt& out3, const ossimDpt& out4);
99 
109  void setFromPoints(const ossimDpt* input,
110  const ossimDpt* output,
111  ossim_uint32 arraySize);
112 
116  virtual void forward(const ossimDpt& input,
117  ossimDpt& output) const
118  {
119  output.x = (m_coefficientsXTerm[0] +
120  m_coefficientsXTerm[1]*input.x +
121  m_coefficientsXTerm[2]*input.y +
122  m_coefficientsXTerm[3]*input.x*input.y);
123  output.y = (m_coefficientsYTerm[0] +
124  m_coefficientsYTerm[1]*input.x +
125  m_coefficientsYTerm[2]*input.y +
126  m_coefficientsYTerm[3]*input.x*input.y);
127  }
128 
133  virtual void forward(ossimDpt& modify_this) const
134  {
135  double saveX = modify_this.x;
136  modify_this.x = (m_coefficientsXTerm[0] +
137  m_coefficientsXTerm[1]*modify_this.x +
138  m_coefficientsXTerm[2]*modify_this.y +
139  m_coefficientsXTerm[3]*modify_this.x*modify_this.y);
140  modify_this.y = (m_coefficientsYTerm[0] +
141  m_coefficientsYTerm[1]*saveX +
142  m_coefficientsYTerm[2]*modify_this.y +
143  m_coefficientsYTerm[3]*saveX*modify_this.y);
144  }
145 
149  virtual void inverse(const ossimDpt& input,
150  ossimDpt& output) const
151  {
152  output.x = (m_inverseCoefficientsXTerm[0] +
153  m_inverseCoefficientsXTerm[1]*input.x +
154  m_inverseCoefficientsXTerm[2]*input.y +
155  m_inverseCoefficientsXTerm[3]*input.x*input.y);
156  output.y = (m_inverseCoefficientsYTerm[0] +
157  m_inverseCoefficientsYTerm[1]*input.x +
158  m_inverseCoefficientsYTerm[2]*input.y +
159  m_inverseCoefficientsYTerm[3]*input.x*input.y);
160  }
161 
166  virtual void inverse(ossimDpt& modify_this) const
167  {
168  double saveX = modify_this.x;
169  modify_this.x = (m_inverseCoefficientsXTerm[0] +
170  m_inverseCoefficientsXTerm[1]*modify_this.x +
171  m_inverseCoefficientsXTerm[2]*modify_this.y +
172  m_inverseCoefficientsXTerm[3]*modify_this.x*modify_this.y);
173  modify_this.y = (m_inverseCoefficientsYTerm[0] +
174  m_inverseCoefficientsYTerm[1]*saveX +
175  m_inverseCoefficientsYTerm[2]*modify_this.y +
176  m_inverseCoefficientsYTerm[3]*saveX*modify_this.y);
177  }
178 
182  virtual bool saveState(ossimKeywordlist& kwl,
183  const char* prefix = 0)const;
184 
188  virtual bool loadState(const ossimKeywordlist& kwl,
189  const char* prefix = 0);
190 
195  virtual std::ostream& print(std::ostream& out) const
196  {
198  out << "xTerm: " << m_coefficientsXTerm[0] << ", " << m_coefficientsXTerm[1] << ", "
199  << m_coefficientsXTerm[2] << ", " << m_coefficientsXTerm[3] << "\n";
200  out << "yTerm: " << m_coefficientsYTerm[0] << ", " << m_coefficientsYTerm[1] << ", "
201  << m_coefficientsYTerm[2] << ", " << m_coefficientsYTerm[3] << "\n";
202 
203  out << "xInverseTerm: " << m_inverseCoefficientsXTerm[0] << ", " << m_inverseCoefficientsXTerm[1] << ", "
204  << m_inverseCoefficientsXTerm[2] << ", " << m_inverseCoefficientsXTerm[3] << "\n";
205  out << "yInverseTerm: " << m_inverseCoefficientsYTerm[0] << ", " << m_inverseCoefficientsYTerm[1] << ", "
206  << m_inverseCoefficientsYTerm[2] << ", " << m_inverseCoefficientsYTerm[3] << "\n";
207 
208  return out;
209  }
210 
211 protected:
212  ossim_float64 m_coefficientsXTerm[4]; // constant, linear x, linear y, cross xy
213  ossim_float64 m_coefficientsYTerm[4]; // constant, linear x, linear y, cross xy
214 
215  ossim_float64 m_inverseCoefficientsXTerm[4]; // constant, linear x, linear y, cross xy
216  ossim_float64 m_inverseCoefficientsYTerm[4]; // constant, linear x, linear y, cross xy
218 };
219 
220 #endif
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
virtual void inverse(ossimDpt &modify_this) const
Inverts the point back to the original input value and modifies the passed in point to the new value...
Represents serializable keyword/value map.
virtual void forward(const ossimDpt &input, ossimDpt &output) const
forward transform will transform an input point to the output.
double y
Definition: ossimDpt.h:165
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
virtual const ossim2dTo2dTransform & operator=(const ossim2dTo2dTransform &rhs)
ossim2dTo2dMatrixTransform(const ossimDpt *input, const ossimDpt *output, ossim_uint32 arraySize)
Initialize the transform that best fits the input and output arrays.
double ossim_float64
unsigned int ossim_uint32
ossim2dTo2dMatrixTransform allows one to specify a set of input points and output points and will fit...
virtual ossimObject * dup() const
Duplication method that duplicates this object.
virtual std::ostream & print(std::ostream &out) const
prints the contents of this object.
#define OSSIM_DLL
double x
Definition: ossimDpt.h:164
virtual void inverse(const ossimDpt &input, ossimDpt &output) const
Inverts the point back to the original input value.
virtual void forward(ossimDpt &modify_this) const
forward transform will transform an input point to the output and modify the passed in point to the n...
virtual std::ostream & print(std::ostream &out) const
Generic print method.
ossim2dTo2dMatrixTransform(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.
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23