OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossim2dBilinearTransform.h
Go to the documentation of this file.
1 #ifndef ossim2dBilinearTransform_HEADER
2 #define ossim2dBilinearTransform_HEADER
4 #include <algorithm>
16 {
17 public:
22 
33  const ossimDpt* output,
34  ossim_uint32 arraySize)
35  {
36  setFromPoints(input, output, arraySize);
37  }
38 
43  ossim2dBilinearTransform(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  setFromPoints(in1, in2, in3, in4, out1, out2, out3, out4);
47  }
48 
53 
57  virtual ossimObject* dup()const{return new ossim2dBilinearTransform(*this);}
58 
66  {
67  if(this == &src) return *this;
68 
69  ossim2dTo2dTransform::operator =(*this); // call base classes equal operator
70  std::copy(src.m_coefficientsXTerm, src.m_coefficientsXTerm+4, m_coefficientsXTerm);
71  std::copy(src.m_coefficientsYTerm, src.m_coefficientsYTerm+4, m_coefficientsYTerm);
72  std::copy(src.m_inverseCoefficientsXTerm, src.m_inverseCoefficientsXTerm+4, m_inverseCoefficientsXTerm);
73  std::copy(src.m_inverseCoefficientsYTerm, src.m_inverseCoefficientsYTerm+4, m_inverseCoefficientsYTerm);
74 
75  return *this;
76  }
77 
82  void setFromPoints(const ossimDpt& in1, const ossimDpt& in2, const ossimDpt& in3, const ossimDpt& in4,
83  const ossimDpt& out1, const ossimDpt& out2, const ossimDpt& out3, const ossimDpt& out4);
84 
94  void setFromPoints(const ossimDpt* input,
95  const ossimDpt* output,
96  ossim_uint32 arraySize);
97 
101  virtual void forward(const ossimDpt& input,
102  ossimDpt& output) const
103  {
104  output.x = (m_coefficientsXTerm[0] +
105  m_coefficientsXTerm[1]*input.x +
106  m_coefficientsXTerm[2]*input.y +
107  m_coefficientsXTerm[3]*input.x*input.y);
108  output.y = (m_coefficientsYTerm[0] +
109  m_coefficientsYTerm[1]*input.x +
110  m_coefficientsYTerm[2]*input.y +
111  m_coefficientsYTerm[3]*input.x*input.y);
112  }
113 
118  virtual void forward(ossimDpt& modify_this) const
119  {
120  double saveX = modify_this.x;
121  modify_this.x = (m_coefficientsXTerm[0] +
122  m_coefficientsXTerm[1]*modify_this.x +
123  m_coefficientsXTerm[2]*modify_this.y +
124  m_coefficientsXTerm[3]*modify_this.x*modify_this.y);
125  modify_this.y = (m_coefficientsYTerm[0] +
126  m_coefficientsYTerm[1]*saveX +
127  m_coefficientsYTerm[2]*modify_this.y +
128  m_coefficientsYTerm[3]*saveX*modify_this.y);
129  }
130 
134  virtual void inverse(const ossimDpt& input,
135  ossimDpt& output) const
136  {
137  output.x = (m_inverseCoefficientsXTerm[0] +
138  m_inverseCoefficientsXTerm[1]*input.x +
139  m_inverseCoefficientsXTerm[2]*input.y +
140  m_inverseCoefficientsXTerm[3]*input.x*input.y);
141  output.y = (m_inverseCoefficientsYTerm[0] +
142  m_inverseCoefficientsYTerm[1]*input.x +
143  m_inverseCoefficientsYTerm[2]*input.y +
144  m_inverseCoefficientsYTerm[3]*input.x*input.y);
145  }
146 
151  virtual void inverse(ossimDpt& modify_this) const
152  {
153  double saveX = modify_this.x;
154  modify_this.x = (m_inverseCoefficientsXTerm[0] +
155  m_inverseCoefficientsXTerm[1]*modify_this.x +
156  m_inverseCoefficientsXTerm[2]*modify_this.y +
157  m_inverseCoefficientsXTerm[3]*modify_this.x*modify_this.y);
158  modify_this.y = (m_inverseCoefficientsYTerm[0] +
159  m_inverseCoefficientsYTerm[1]*saveX +
160  m_inverseCoefficientsYTerm[2]*modify_this.y +
161  m_inverseCoefficientsYTerm[3]*saveX*modify_this.y);
162  }
163 
167  virtual bool saveState(ossimKeywordlist& kwl,
168  const char* prefix = 0)const;
169 
173  virtual bool loadState(const ossimKeywordlist& kwl,
174  const char* prefix = 0);
175 
180  virtual std::ostream& print(std::ostream& out) const
181  {
183  out << "xTerm: " << m_coefficientsXTerm[0] << ", " << m_coefficientsXTerm[1] << ", "
184  << m_coefficientsXTerm[2] << ", " << m_coefficientsXTerm[3] << "\n";
185  out << "yTerm: " << m_coefficientsYTerm[0] << ", " << m_coefficientsYTerm[1] << ", "
186  << m_coefficientsYTerm[2] << ", " << m_coefficientsYTerm[3] << "\n";
187 
188  out << "xInverseTerm: " << m_inverseCoefficientsXTerm[0] << ", " << m_inverseCoefficientsXTerm[1] << ", "
189  << m_inverseCoefficientsXTerm[2] << ", " << m_inverseCoefficientsXTerm[3] << "\n";
190  out << "yInverseTerm: " << m_inverseCoefficientsYTerm[0] << ", " << m_inverseCoefficientsYTerm[1] << ", "
191  << m_inverseCoefficientsYTerm[2] << ", " << m_inverseCoefficientsYTerm[3] << "\n";
192 
193  return out;
194  }
195 
196 protected:
197  ossim_float64 m_coefficientsXTerm[4]; // constant, linear x, linear y, cross xy
198  ossim_float64 m_coefficientsYTerm[4]; // constant, linear x, linear y, cross xy
199 
200  ossim_float64 m_inverseCoefficientsXTerm[4]; // constant, linear x, linear y, cross xy
201  ossim_float64 m_inverseCoefficientsYTerm[4]; // constant, linear x, linear y, cross xy
203 };
204 
205 #endif
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Represents serializable keyword/value map.
ossim_float64 m_inverseCoefficientsXTerm[4]
double y
Definition: ossimDpt.h:165
ossim_float64 m_inverseCoefficientsYTerm[4]
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
virtual const ossim2dTo2dTransform & operator=(const ossim2dTo2dTransform &rhs)
virtual std::ostream & print(std::ostream &out) const
prints the contents of this object.
virtual ossimObject * dup() const
Duplication method that duplicates this object.
double ossim_float64
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...
unsigned int ossim_uint32
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...
#define OSSIM_DLL
virtual void forward(const ossimDpt &input, ossimDpt &output) const
forward transform will transform an input point to the output.
ossim2dBilinearTransform(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.
double x
Definition: ossimDpt.h:164
virtual void inverse(const ossimDpt &input, ossimDpt &output) const
Inverts the point back to the original input value.
ossim2dBilinearTransform allows one to specify a set of input points and output points and will fit a...
virtual std::ostream & print(std::ostream &out) const
Generic print method.
ossim2dBilinearTransform(const ossimDpt *input, const ossimDpt *output, ossim_uint32 arraySize)
Initialize the transform that best fits the input and output arrays.
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23