// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
-// You should have received a copy of the GNU Library General Public
-// License along with this library; if not, write to the
-// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-// Boston, MA 02111-1307, USA.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef SGGeoc_H
public:
/// Default constructor, initializes the instance to lat = lon = lat = 0
SGGeoc(void);
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- /// Note that this conversion is relatively expensive to compute
- SGGeoc(const SGGeod& geod);
/// Factory from angular values in radians and radius in ft
static SGGeoc fromRadFt(double lon, double lat, double radius);
static SGGeoc fromRadM(double lon, double lat, double radius);
/// Factory from angular values in degrees and radius in m
static SGGeoc fromDegM(double lon, double lat, double radius);
+ /// Factory to convert position from a cartesian position assumed to be
+ /// in wgs84 measured in meters
+ /// Note that this conversion is relatively expensive to compute
+ static SGGeoc fromCart(const SGVec3<double>& cart);
+ /// Factory to convert position from a geodetic position
+ /// Note that this conversion is relatively expensive to compute
+ static SGGeoc fromGeod(const SGGeod& geod);
/// Return the geocentric longitude in radians
double getLongitudeRad(void) const;
/// Set the geocentric radius from the argument given in feet
void setRadiusFt(double radius);
+ SGGeoc advanceRadM(double course, double distance) const;
+ static double courseRad(const SGGeoc& from, const SGGeoc& to);
+ static double courseDeg(const SGGeoc& from, const SGGeoc& to);
+ static double distanceM(const SGGeoc& from, const SGGeoc& to);
+
private:
/// This one is private since construction is not unique if you do
/// not know the units of the arguments, use the factory methods for
{
}
-inline
-SGGeoc::SGGeoc(const SGVec3<double>& cart)
-{
- SGGeodesy::SGCartToGeoc(cart, *this);
-}
-
-inline
-SGGeoc::SGGeoc(const SGGeod& geod)
-{
- SGVec3<double> cart;
- SGGeodesy::SGGeodToCart(geod, cart);
- SGGeodesy::SGCartToGeoc(cart, *this);
-}
-
inline
SGGeoc
SGGeoc::fromRadFt(double lon, double lat, double radius)
#endif
}
+inline
+SGGeoc
+SGGeoc::fromCart(const SGVec3<double>& cart)
+{
+ SGGeoc geoc;
+ SGGeodesy::SGCartToGeoc(cart, geoc);
+ return geoc;
+}
+
+inline
+SGGeoc
+SGGeoc::fromGeod(const SGGeod& geod)
+{
+ SGVec3<double> cart;
+ SGGeodesy::SGGeodToCart(geod, cart);
+ SGGeoc geoc;
+ SGGeodesy::SGCartToGeoc(cart, geoc);
+ return geoc;
+}
+
inline
double
SGGeoc::getLongitudeRad(void) const
#ifdef SG_GEOC_NATIVE_DEGREE
return _lon;
#else
- return _lon*SGD_DEGREES_TO_RADIANS;
+ return _lon*SGD_RADIANS_TO_DEGREES;
#endif
}
#ifdef SG_GEOC_NATIVE_DEGREE
_lon = lon;
#else
- _lon = lon*SGD_RADIANS_TO_DEGREES;
+ _lon = lon*SGD_DEGREES_TO_RADIANS;
#endif
}
#ifdef SG_GEOC_NATIVE_DEGREE
return _lat;
#else
- return _lat*SGD_DEGREES_TO_RADIANS;
+ return _lat*SGD_RADIANS_TO_DEGREES;
#endif
}
#ifdef SG_GEOC_NATIVE_DEGREE
_lat = lat;
#else
- _lat = lat*SGD_RADIANS_TO_DEGREES;
+ _lat = lat*SGD_DEGREES_TO_RADIANS;
#endif
}
_radius = radius*SG_FEET_TO_METER;
}
+inline
+SGGeoc
+SGGeoc::advanceRadM(double course, double distance) const
+{
+ SGGeoc result;
+ SGGeodesy::advanceRadM(*this, course, distance, result);
+ return result;
+}
+
+inline
+double
+SGGeoc::courseRad(const SGGeoc& from, const SGGeoc& to)
+{
+ return SGGeodesy::courseRad(from, to);
+}
+
+inline
+double
+SGGeoc::courseDeg(const SGGeoc& from, const SGGeoc& to)
+{
+ return SGMiscd::rad2deg(courseRad(from, to));
+}
+
+inline
+double
+SGGeoc::distanceM(const SGGeoc& from, const SGGeoc& to)
+{
+ return SGGeodesy::distanceM(from, to);
+}
+
/// Output to an ostream
template<typename char_type, typename traits_type>
inline