Isis 3 Programmer Reference
SurfacePoint.h
1#ifndef SurfacePoint_h
2#define SurfacePoint_h
8/* SPDX-License-Identifier: CC0-1.0 */
9#include <vector>
10#include <cmath>
11
12// Qt library
13#include <QString>
14
15#include "boost/numeric/ublas/symmetric.hpp"
16#include "boost/numeric/ublas/io.hpp"
17
18// ISIS library
19#include "Displacement.h"
20#include "Distance.h"
21#include "Angle.h"
22
23namespace Isis {
24 class Latitude;
25 class Longitude;
26
133 public:
134
135 // definitions
143 enum CoordUnits {
144 Degrees,
145 Kilometers,
146 Meters,
147 Radians
148 };
149 enum CoordIndex {
150 One=0,
151 Two=1,
152 Three=2
153 };
154
155 // Constructors
156 SurfacePoint();
157 SurfacePoint(const SurfacePoint &other);
158 SurfacePoint(const Latitude &lat, const Longitude &lon,
159 const Distance &radius);
160 SurfacePoint(const Latitude &lat, const Longitude &lon,
161 const Distance &radius, const Angle &latSigma, const Angle &lonSigma,
162 const Distance &radiusSigma);
163 SurfacePoint(const Latitude &lat, const Longitude &lon,
164 const Distance &radius,
165 const boost::numeric::ublas::symmetric_matrix
166 <double,boost::numeric::ublas::upper>& covar);
167 SurfacePoint(const Displacement &x, const Displacement &y,
168 const Displacement &z);
169 SurfacePoint(const Displacement &x, const Displacement &y,
170 const Displacement &z, const Distance &xSigma, const Distance &ySigma,
171 const Distance &zSigma);
172 SurfacePoint(const Displacement &x, const Displacement &y,
173 const Displacement &z,
174 const boost::numeric::ublas::symmetric_matrix
175 <double,boost::numeric::ublas::upper>& covar);
177
178// Rectangular loading utilities
179 void SetRectangular(const Displacement &x, const Displacement &y,
180 const Displacement &z, const Distance &xSigma=Distance(),
181 const Distance &ySigma=Distance(), const Distance &zSigma=Distance());
182
183 void SetRectangular(const Displacement x, const Displacement y, const Displacement z,
184 const boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>& covar);
185
186 void SetRectangularCoordinates(const Displacement &x, const Displacement &y,
187 const Displacement &z);
188
190 void SetRectangularSigmas(const Distance &xSigma, const Distance &ySigma,
191 const Distance &zSigma);
192
194 const boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>& covar,
195 SurfacePoint::CoordUnits units = SurfacePoint::Meters);
196
197// Spherical loading utilities
198
201 void SetSpherical (const Latitude &lat, const Longitude &lon,
202 const Distance &radius, const Angle &latSigma=Angle(),
203 const Angle &lonSigma=Angle(),
204 const Distance &radiusSigma=Distance());
205
206 void SetSpherical (const Latitude &lat, const Longitude &lon,
207 const Distance &radius,
208 const boost::numeric::ublas::symmetric_matrix
209 <double,boost::numeric::ublas::upper>& covar);
210
211 void SetSphericalCoordinates(const Latitude &lat, const Longitude &lon,
212 const Distance &radius);
213
215 const boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>& covar,
216 SurfacePoint::CoordUnits units = SurfacePoint::Meters);
217
218 void SetSphericalSigmas(const Angle &latSigma, const Angle &lonSigma,
219 const Distance &radiusSigma);
220
221 void SetSphericalSigmasDistance(const Distance &latSigma,
222 const Distance &lonSigma,
223 const Distance &radiusSigma);
224
225 void ResetLocalRadius(const Distance &radius);
226 bool Valid() const;
227
228// Generic utilities for convenience
229
231 void SetMatrix(CoordinateType type,
232 const boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>& covar);
233
235 // coordinate type with respect to the indicated coordinate (specified by index).
236 std::vector<double> Partial(CoordinateType type, CoordIndex index);
237
238// Output methods
239 double GetCoord(CoordinateType type, CoordIndex index, CoordUnits units);
240 // Consider making this GetSigmaDistance and use the Distance methods to specify units for
241 // maximum flexibility and safety. ***TBD***
242 double GetSigma(CoordinateType type, CoordIndex index, CoordUnits units);
243 Distance GetSigmaDistance(CoordinateType type, CoordIndex index);
244 double GetWeight(CoordinateType type, CoordIndex index);
245 Displacement GetX() const;
246 Displacement GetY() const;
247 Displacement GetZ() const;
248 Distance GetXSigma() const;
249 Distance GetYSigma() const;
250 Distance GetZSigma() const;
251 double GetXWeight() const;
252 double GetYWeight() const;
253 double GetZWeight() const;
254 boost::numeric::ublas::symmetric_matrix<double,boost::numeric::ublas::upper>
255 GetRectangularMatrix(SurfacePoint::CoordUnits units = SurfacePoint::Meters) const;
256 Latitude GetLatitude() const;
257 Longitude GetLongitude() const;
258 Distance GetLocalRadius() const;
259 Angle GetLatSigma() const;
260 Distance GetLatSigmaDistance() const;
261 double GetLatWeight() const;
262 Angle GetLonSigma() const;
263 Distance GetLonSigmaDistance() const;
264 double GetLonWeight() const;
265 Distance GetLocalRadiusSigma() const;
266 double GetLocalRadiusWeight() const;
267 boost::numeric::ublas::symmetric_matrix
268 <double,boost::numeric::ublas::upper> GetSphericalMatrix
269 (SurfacePoint::CoordUnits units = SurfacePoint::Meters) const;
270
271// Conversion methods (for convenience)
272 double DisplacementToDouble(Displacement disp, CoordUnits units);
273 double DistanceToDouble(Distance dist, CoordUnits units);
274 double MetersToLatitude(double latLength);
275 double MetersToLongitude(double lonLength);
276 double LatitudeToMeters(double latitude) const;
277 double LongitudeToMeters(double longitude) const;
278 double LatToDouble(Latitude lat, CoordUnits units);
279 double LonToDouble(Longitude lon, CoordUnits units);
280 static CoordinateType stringToCoordinateType(QString type);
281 static QString coordinateTypeToString(CoordinateType type);
282
283// Computational methods
284 Distance GetDistanceToPoint(const SurfacePoint &other) const;
285 Distance GetDistanceToPoint(const SurfacePoint &other,
286 const Distance &sphereRadius) const;
287 std::vector<double> LatitudinalDerivative(CoordIndex index);
288 std::vector<double> RectangularDerivative(CoordIndex index);
289
290// Misc methods
291 void ToNaifArray(double naifOutput[3]) const;
292 void FromNaifArray(const double naifValues[3]);
293
294// Operators
295 bool operator==(const SurfacePoint &other) const;
296 SurfacePoint &operator=(const SurfacePoint &other);
297
298 private:
299 void ComputeLocalRadius();
300 void InitCovariance();
301 void InitPoint();
302 void SetRectangularPoint(const Displacement &x, const Displacement &y, const Displacement &z);
303 void SetSphericalPoint(const Latitude &lat, const Longitude &lon, const Distance &radius);
304 void FreeAllocatedMemory();
305
306 Distance p_localRadius;
307 Displacement *p_x;
308 Displacement *p_y;
309 Displacement *p_z;
311 boost::numeric::ublas::symmetric_matrix
312 <double,boost::numeric::ublas::upper> *p_rectCovar;
314 boost::numeric::ublas::symmetric_matrix
315 <double,boost::numeric::ublas::upper> *p_sphereCovar;
316 };
317};
318
319#endif
320
This class defines a body-fixed surface point.
void SetRectangularCoordinates(const Displacement &x, const Displacement &y, const Displacement &z)
Set surface point in rectangular coordinates.
CoordinateType
Defines the coordinate typ, units, and coordinate index for some of the output methods.
@ Latitudinal
Planetocentric latitudinal (lat/lon/rad) coordinates.
@ Rectangular
Body-fixed rectangular x/y/z coordinates.
std::vector< double > LatitudinalDerivative(CoordIndex index)
Compute partial derivative of the conversion of the latitudinal coordinates to body-fixed rectangular...
void SetMatrix(CoordinateType type, const boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > &covar)
Set the covariance matrix.
void SetSphericalCoordinates(const Latitude &lat, const Longitude &lon, const Distance &radius)
Update spherical coordinates (lat/lon/radius)
static QString coordinateTypeToString(CoordinateType type)
Converts the given SurfacePoint::CoordinateType enumeration to a string.
double LatToDouble(Latitude lat, CoordUnits units)
This method returns a double version of a Latitude in the specified units.
Latitude GetLatitude() const
Return the body-fixed latitude for the surface point.
void SetRectangularSigmas(const Distance &xSigma, const Distance &ySigma, const Distance &zSigma)
Set surface point and sigmas in rectangular coordinates and convert to planetocentric.
double GetLonWeight() const
Return longitude weight for bundle adjustment Units are 1/(radians)^2.
double DistanceToDouble(Distance dist, CoordUnits units)
This method returns a double version of a Distance in the specified units.
void SetSphericalSigmasDistance(const Distance &latSigma, const Distance &lonSigma, const Distance &radiusSigma)
Set the spherical sigmas (in Distance units) into the spherical variance/covariance matrix.
Distance GetLonSigmaDistance() const
Return the longitude sigma in meters.
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 ToNaifArray(double naifOutput[3]) const
A naif array is a c-style array of size 3.
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.
boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > * p_rectCovar
3x3 upper triangular covariance matrix rectangular coordinates
void ComputeLocalRadius()
Compute the local radius of the surface point.
Distance GetDistanceToPoint(const SurfacePoint &other) const
Computes and returns the distance between two surface points.
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...
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 MetersToLongitude(double lonLength)
This method returns an angular measure in radians of a distance in the direction of and relative to t...
boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > * p_sphereCovar
3x3 upper triangular covariance matrix ocentric coordinates
~SurfacePoint()
Destroys a SurfacePoint object/.
void InitCovariance()
Initialize the variance/covariance matrices.
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.
double LongitudeToMeters(double longitude) const
This method returns a length in meters version of a delta longitude angle in radians relative to the ...
double GetZWeight() const
Return Z weight for bundle adjustment Units are 1/(kilometers)^2.
Longitude GetLongitude() const
Return the body-fixed longitude for the surface point.
void SetSphericalMatrix(const boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > &covar, SurfacePoint::CoordUnits units=SurfacePoint::Meters)
Set spherical covariance matrix.
static CoordinateType stringToCoordinateType(QString type)
This method converts the given string value to a SurfacePoint::CoordinateType enumeration.
std::vector< double > RectangularDerivative(CoordIndex index)
Compute partial derivative of the body-fixed rectangular coordinates with respect to the indicated co...
double GetCoord(CoordinateType type, CoordIndex index, CoordUnits units)
This method returns a coordinate of a SurfacePoint.
double GetLocalRadiusWeight() const
Return radius weight for bundle adjustment Units are 1/(kilometers)^2.
double LatitudeToMeters(double latitude) const
This method returns a Displacement of an Angle relative to the current SurfacePoint latitude.
SurfacePoint()
Constructs an empty SurfacePoint object.
double MetersToLatitude(double latLength)
This method returns an angular measure of a distance in the direction of and relative to the latitude...
double DisplacementToDouble(Displacement disp, CoordUnits units)
This method returns a double version of a Displacement in the specified units.
double GetYWeight() const
Return Y weight for bundle adjustment Units are 1/(kilometers)^2.
double GetSigma(CoordinateType type, CoordIndex index, CoordUnits units)
This method returns a sigma of a SurfacePoint coordinate.
double GetLatWeight() const
Return latitude weight for bundle adjustment Units are 1/(radians)^2.
Distance GetSigmaDistance(CoordinateType type, CoordIndex index)
This method returns a sigma of a SurfacePoint coordinate as a Distance.
std::vector< double > Partial(CoordinateType type, CoordIndex index)
Compute partial derivative of conversion from body-fixed coordinates to the specified.
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 ResetLocalRadius(const Distance &radius)
This method resets the local radius of a SurfacePoint.
void FromNaifArray(const double naifValues[3])
A naif array is a c-style array of size 3.
double GetXWeight() const
Return X weight for bundle adjustment Units are 1/(kilometers)^2.
Distance GetLatSigmaDistance() const
Return the latitude sigma as a Distance.
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...
Distance GetLocalRadius() const
Return the radius of the surface point.
double LonToDouble(Longitude lon, CoordUnits units)
This method returns a double version of a Longitude in the specified units.
void InitPoint()
Initialize a surface point.
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16