Isis 3 Programmer Reference
SurfacePoint.h
Go to the documentation of this file.
1 #ifndef SurfacePoint_h
2 #define SurfacePoint_h
3 
25 #include <vector>
26 #include <cmath>
27 
28 // Qt library
29 #include <QString>
30 
31 #include "boost/numeric/ublas/symmetric.hpp"
32 #include "boost/numeric/ublas/io.hpp"
33 
34 // ISIS library
35 #include "Displacement.h"
36 #include "Distance.h"
37 #include "Angle.h"
38 
39 namespace Isis {
40  class Latitude;
41  class Longitude;
42 
148  class SurfacePoint {
149  public:
150 
151  // definitions
158  };
159  enum CoordUnits {
160  Degrees,
161  Kilometers,
162  Meters,
163  Radians
164  };
165  enum CoordIndex {
166  One=0,
167  Two=1,
168  Three=2
169  };
170 
171  // Constructors
172  SurfacePoint();
173  SurfacePoint(const SurfacePoint &other);
174  SurfacePoint(const Latitude &lat, const Longitude &lon,
175  const Distance &radius);
176  SurfacePoint(const Latitude &lat, const Longitude &lon,
177  const Distance &radius, const Angle &latSigma, const Angle &lonSigma,
178  const Distance &radiusSigma);
179  SurfacePoint(const Latitude &lat, const Longitude &lon,
180  const Distance &radius,
181  const boost::numeric::ublas::symmetric_matrix
182  <double,boost::numeric::ublas::upper>& covar);
183  SurfacePoint(const Displacement &x, const Displacement &y,
184  const Displacement &z);
185  SurfacePoint(const Displacement &x, const Displacement &y,
186  const Displacement &z, const Distance &xSigma, const Distance &ySigma,
187  const Distance &zSigma);
188  SurfacePoint(const Displacement &x, const Displacement &y,
189  const Displacement &z,
190  const boost::numeric::ublas::symmetric_matrix
191  <double,boost::numeric::ublas::upper>& covar);
192  ~SurfacePoint();
193 
194 // Rectangular loading utilities
195  void SetRectangular(const Displacement &x, const Displacement &y,
196  const Displacement &z, const Distance &xSigma=Distance(),
197  const Distance &ySigma=Distance(), const Distance &zSigma=Distance());
198 
199  void SetRectangular(const Displacement x, const Displacement y, const Displacement z,
200  const boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>& covar);
201 
202  void SetRectangularCoordinates(const Displacement &x, const Displacement &y,
203  const Displacement &z);
204 
206  void SetRectangularSigmas(const Distance &xSigma, const Distance &ySigma,
207  const Distance &zSigma);
208 
210  const boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>& covar,
211  SurfacePoint::CoordUnits units = SurfacePoint::Meters);
212 
213 // Spherical loading utilities
214 
217  void SetSpherical (const Latitude &lat, const Longitude &lon,
218  const Distance &radius, const Angle &latSigma=Angle(),
219  const Angle &lonSigma=Angle(),
220  const Distance &radiusSigma=Distance());
221 
222  void SetSpherical (const Latitude &lat, const Longitude &lon,
223  const Distance &radius,
224  const boost::numeric::ublas::symmetric_matrix
225  <double,boost::numeric::ublas::upper>& covar);
226 
227  void SetSphericalCoordinates(const Latitude &lat, const Longitude &lon,
228  const Distance &radius);
229 
230  void SetSphericalMatrix(
231  const boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>& covar,
232  SurfacePoint::CoordUnits units = SurfacePoint::Meters);
233 
234  void SetSphericalSigmas(const Angle &latSigma, const Angle &lonSigma,
235  const Distance &radiusSigma);
236 
237  void SetSphericalSigmasDistance(const Distance &latSigma,
238  const Distance &lonSigma,
239  const Distance &radiusSigma);
240 
241  void ResetLocalRadius(const Distance &radius);
242  bool Valid() const;
243 
244 // Generic utilities for convenience
245 
247  void SetMatrix(CoordinateType type,
248  const boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>& covar);
249 
251  // coordinate type with respect to the indicated coordinate (specified by index).
252  std::vector<double> Partial(CoordinateType type, CoordIndex index);
253 
254 // Output methods
255  double GetCoord(CoordinateType type, CoordIndex index, CoordUnits units);
256  // Consider making this GetSigmaDistance and use the Distance methods to specify units for
257  // maximum flexibility and safety. ***TBD***
258  double GetSigma(CoordinateType type, CoordIndex index, CoordUnits units);
259  Distance GetSigmaDistance(CoordinateType type, CoordIndex index);
260  double GetWeight(CoordinateType type, CoordIndex index);
261  Displacement GetX() const;
262  Displacement GetY() const;
263  Displacement GetZ() const;
264  Distance GetXSigma() const;
265  Distance GetYSigma() const;
266  Distance GetZSigma() const;
267  double GetXWeight() const;
268  double GetYWeight() const;
269  double GetZWeight() const;
270  boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>
271  GetRectangularMatrix(SurfacePoint::CoordUnits units = SurfacePoint::Meters) const;
272  Latitude GetLatitude() const;
273  Longitude GetLongitude() const;
274  Distance GetLocalRadius() const;
275  Angle GetLatSigma() const;
276  Distance GetLatSigmaDistance() const;
277  double GetLatWeight() const;
278  Angle GetLonSigma() const;
279  Distance GetLonSigmaDistance() const;
280  double GetLonWeight() const;
281  Distance GetLocalRadiusSigma() const;
282  double GetLocalRadiusWeight() const;
283  boost::numeric::ublas::symmetric_matrix
284  <double,boost::numeric::ublas::upper> GetSphericalMatrix
285  (SurfacePoint::CoordUnits units = SurfacePoint::Meters) const;
286 
287 // Conversion methods (for convenience)
288  double DisplacementToDouble(Displacement disp, CoordUnits units);
289  double DistanceToDouble(Distance dist, CoordUnits units);
290  double MetersToLatitude(double latLength);
291  double MetersToLongitude(double lonLength);
292  double LatitudeToMeters(double latitude) const;
293  double LongitudeToMeters(double longitude) const;
294  double LatToDouble(Latitude lat, CoordUnits units);
295  double LonToDouble(Longitude lon, CoordUnits units);
296  static CoordinateType stringToCoordinateType(QString type);
297  static QString coordinateTypeToString(CoordinateType type);
298 
299 // Computational methods
300  Distance GetDistanceToPoint(const SurfacePoint &other) const;
301  Distance GetDistanceToPoint(const SurfacePoint &other,
302  const Distance &sphereRadius) const;
303  std::vector<double> LatitudinalDerivative(CoordIndex index);
304  std::vector<double> RectangularDerivative(CoordIndex index);
305 
306 // Misc methods
307  void ToNaifArray(double naifOutput[3]) const;
308  void FromNaifArray(const double naifValues[3]);
309 
310 // Operators
311  bool operator==(const SurfacePoint &other) const;
312  SurfacePoint &operator=(const SurfacePoint &other);
313 
314  private:
315  void ComputeLocalRadius();
316  void InitCovariance();
317  void InitPoint();
318  void SetRectangularPoint(const Displacement &x, const Displacement &y, const Displacement &z);
319  void SetSphericalPoint(const Latitude &lat, const Longitude &lon, const Distance &radius);
320  void FreeAllocatedMemory();
321 
322  Distance p_localRadius;
323  Displacement *p_x;
324  Displacement *p_y;
325  Displacement *p_z;
327  boost::numeric::ublas::symmetric_matrix
328  <double,boost::numeric::ublas::upper> *p_rectCovar;
330  boost::numeric::ublas::symmetric_matrix
331  <double,boost::numeric::ublas::upper> *p_sphereCovar;
332  };
333 };
334 
335 #endif
336 
This class defines a body-fixed surface point.
Definition: SurfacePoint.h:148
double LonToDouble(Longitude lon, CoordUnits units)
This method returns a double version of a Longitude in the specified units.
boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > * p_sphereCovar
3x3 upper triangular covariance matrix ocentric coordinates
Definition: SurfacePoint.h:331
void SetSpherical(const Latitude &lat, const Longitude &lon, const Distance &radius, const Angle &latSigma=Angle(), const Angle &lonSigma=Angle(), const Distance &radiusSigma=Distance())
Set surface point and covariance matrix in planetocentric coordinates and convert to rectangular (Lat...
double GetYWeight() const
Return Y weight for bundle adjustment Units are 1/(kilometers)^2.
boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > * p_rectCovar
3x3 upper triangular covariance matrix rectangular coordinates
Definition: SurfacePoint.h:328
void SetRectangularPoint(const Displacement &x, const Displacement &y, const Displacement &z)
This is a private method to set a surface point in rectangular, body-fixed coordinates.
Distance GetDistanceToPoint(const SurfacePoint &other) const
Computes and returns the distance between two surface points.
void ComputeLocalRadius()
Compute the local radius of the surface point.
double MetersToLatitude(double latLength)
This method returns an angular measure of a distance in the direction of and relative to the latitude...
~SurfacePoint()
Destroys a SurfacePoint object/.
void SetRectangularCoordinates(const Displacement &x, const Displacement &y, const Displacement &z)
Set surface point in rectangular coordinates.
Distance GetLatSigmaDistance() const
Return the latitude sigma as a Distance.
double GetSigma(CoordinateType type, CoordIndex index, CoordUnits units)
This method returns a sigma of a SurfacePoint coordinate.
void ResetLocalRadius(const Distance &radius)
This method resets the local radius of a SurfacePoint.
Distance GetLonSigmaDistance() const
Return the longitude sigma in meters.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
std::vector< double > LatitudinalDerivative(CoordIndex index)
Compute partial derivative of the conversion of the latitudinal coordinates to body-fixed rectangular...
Latitude GetLatitude() const
Return the body-fixed latitude for the surface point.
double GetCoord(CoordinateType type, CoordIndex index, CoordUnits units)
This method returns a coordinate of a SurfacePoint.
void SetRectangularSigmas(const Distance &xSigma, const Distance &ySigma, const Distance &zSigma)
Set surface point and sigmas in rectangular coordinates and convert to planetocentric.
std::vector< double > RectangularDerivative(CoordIndex index)
Compute partial derivative of the body-fixed rectangular coordinates with respect to the indicated co...
double GetZWeight() const
Return Z weight for bundle adjustment Units are 1/(kilometers)^2.
void InitPoint()
Initialize a surface point.
Planetocentric latitudinal (lat/lon/rad) coordinates.
Definition: SurfacePoint.h:156
void SetRectangularMatrix(const boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > &covar, SurfacePoint::CoordUnits units=SurfacePoint::Meters)
Set rectangular covariance matrix and store in units of km**2.
void SetSphericalMatrix(const boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > &covar, SurfacePoint::CoordUnits units=SurfacePoint::Meters)
Set spherical covariance matrix.
void InitCovariance()
Initialize the variance/covariance matrices.
double LongitudeToMeters(double longitude) const
This method returns a length in meters version of a delta longitude angle in radians relative to the ...
std::vector< double > Partial(CoordinateType type, CoordIndex index)
Compute partial derivative of conversion from body-fixed coordinates to the specified.
double DisplacementToDouble(Displacement disp, CoordUnits units)
This method returns a double version of a Displacement in the specified units.
static QString coordinateTypeToString(CoordinateType type)
Converts the given SurfacePoint::CoordinateType enumeration to a string.
double MetersToLongitude(double lonLength)
This method returns an angular measure in radians of a distance in the direction of and relative to t...
void SetSphericalPoint(const Latitude &lat, const Longitude &lon, const Distance &radius)
This is a private method to set a surface point in spherical (lat/lon/radius), body-fixed coordinates...
double GetLocalRadiusWeight() const
Return radius weight for bundle adjustment Units are 1/(kilometers)^2.
double LatToDouble(Latitude lat, CoordUnits units)
This method returns a double version of a Latitude in the specified units.
void SetMatrix(CoordinateType type, const boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > &covar)
Set the covariance matrix.
Body-fixed rectangular x/y/z coordinates.
Definition: SurfacePoint.h:157
CoordinateType
Defines the coordinate typ, units, and coordinate index for some of the output methods.
Definition: SurfacePoint.h:155
Distance GetSigmaDistance(CoordinateType type, CoordIndex index)
This method returns a sigma of a SurfacePoint coordinate as a Distance.
double GetLonWeight() const
Return longitude weight for bundle adjustment Units are 1/(radians)^2.
static CoordinateType stringToCoordinateType(QString type)
This method converts the given string value to a SurfacePoint::CoordinateType enumeration.
double LatitudeToMeters(double latitude) const
This method returns a Displacement of an Angle relative to the current SurfacePoint latitude...
void SetSphericalSigmas(const Angle &latSigma, const Angle &lonSigma, const Distance &radiusSigma)
Set the spherical sigmas into the spherical variance/covariance matrix in diagonal units of radians^2...
Longitude GetLongitude() const
Return the body-fixed longitude for the surface point.
double GetXWeight() const
Return X weight for bundle adjustment Units are 1/(kilometers)^2.
void ToNaifArray(double naifOutput[3]) const
A naif array is a c-style array of size 3.
void FromNaifArray(const double naifValues[3])
A naif array is a c-style array of size 3.
double DistanceToDouble(Distance dist, CoordUnits units)
This method returns a double version of a Distance in the specified units.
Namespace for ISIS/Bullet specific routines.
Definition: Apollo.h:31
void SetSphericalSigmasDistance(const Distance &latSigma, const Distance &lonSigma, const Distance &radiusSigma)
Set the spherical sigmas (in Distance units) into the spherical variance/covariance matrix...
SurfacePoint()
Constructs an empty SurfacePoint object.
double GetWeight(CoordinateType type, CoordIndex index)
This method returns the weight of a SurfacePoint coordinate Note: At this time a units argument is no...
void SetSphericalCoordinates(const Latitude &lat, const Longitude &lon, const Distance &radius)
Update spherical coordinates (lat/lon/radius)
Distance GetLocalRadius() const
Return the radius of the surface point.
double GetLatWeight() const
Return latitude weight for bundle adjustment Units are 1/(radians)^2.
void SetRectangular(const Displacement &x, const Displacement &y, const Displacement &z, const Distance &xSigma=Distance(), const Distance &ySigma=Distance(), const Distance &zSigma=Distance())
Set surface point in rectangular body-fixed coordinates wtih optional sigmas.