]> git.mxchange.org Git - simgear.git/commitdiff
Add some syntactic helpers to allow distance/course to be queried between
authorjmt <jmt>
Fri, 26 Dec 2008 12:08:28 +0000 (12:08 +0000)
committerTim Moore <timoore@redhat.com>
Thu, 8 Jan 2009 22:05:12 +0000 (23:05 +0100)
two geodetic points. This still entails a full _geo_inverse_wgs_84 call,
but makes call sites neater.

simgear/math/SGGeodesy.cxx
simgear/math/SGGeodesy.hxx

index 819acdd029cbc5db83827f50307afd67cf9aa965..f105dfa56164841125d6745a70dc7157913f0981 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <cmath>
 
+#include "structure/exception.hxx"
 #include "SGMath.hxx"
 
 // These are hard numbers from the WGS84 standard.  DON'T MODIFY
@@ -423,6 +424,40 @@ SGGeodesy::inverse(const SGGeod& p1, const SGGeod& p2, double& course1,
   return ret == 0;
 }
 
+double
+SGGeodesy::courseDeg(const SGGeod& p1, const SGGeod& p2)
+{
+  double course1, course2, distance;
+  int r = _geo_inverse_wgs_84(p1.getLatitudeDeg(), p1.getLongitudeDeg(),
+                                p2.getLatitudeDeg(), p2.getLongitudeDeg(),
+                                &course1, &course2, &distance);
+  if (r != 0) {
+    throw sg_exception("SGGeodesy::courseDeg, unable to compute course");
+  }
+  
+  return course1;
+}
+
+double
+SGGeodesy::distanceM(const SGGeod& p1, const SGGeod& p2)
+{
+  double course1, course2, distance;
+  int r = _geo_inverse_wgs_84(p1.getLatitudeDeg(), p1.getLongitudeDeg(),
+                                p2.getLatitudeDeg(), p2.getLongitudeDeg(),
+                                &course1, &course2, &distance);
+  if (r != 0) {
+    throw sg_exception("SGGeodesy::distanceM, unable to compute distance");
+  }
+  
+  return distance;
+}
+
+double
+SGGeodesy::distanceNm(const SGGeod& from, const SGGeod& to)
+{
+  return distanceM(from, to) * SG_METER_TO_NM;
+}
+
 /// Geocentric routines
 
 void
index 8128b8327f0c7af8365fefd66dc01e9a8c37a6f6..53e2cbb3734b749efc39923ae78434aa4ce7e072 100644 (file)
@@ -53,6 +53,10 @@ public:
   static bool inverse(const SGGeod& p1, const SGGeod& p2, double& course1,
                       double& course2, double& distance);
 
+  static double courseDeg(const SGGeod& from, const SGGeod& to);
+  static double distanceM(const SGGeod& from, const SGGeod& to);
+  static double distanceNm(const SGGeod& from, const SGGeod& to);
+    
   // Geocentric course/distance computation
   static void advanceRadM(const SGGeoc& geoc, double course, double distance,
                           SGGeoc& result);