]> git.mxchange.org Git - flightgear.git/commitdiff
Refactor airway code to use SGGeod in external APIs. First of various changes to...
authorjmt <jmt>
Wed, 7 Oct 2009 08:34:53 +0000 (08:34 +0000)
committerTim Moore <timoore@redhat.com>
Thu, 8 Oct 2009 08:37:21 +0000 (10:37 +0200)
src/AIModel/AIFlightPlanCreateCruise.cxx
src/Navaids/awynet.cxx
src/Navaids/awynet.hxx

index 4f44ab1e25d3d160574ceef01bc09ab8e39306b9..d20a2134be25c086e7ac21b538d03a0744f5b61f 100755 (executable)
@@ -76,18 +76,14 @@ void FGAIFlightPlan::evaluateRoutePart(double deplat,
       }
       
       //cerr << "1"<< endl;
-      SGGeoc geoc = SGGeoc::fromCart(SGVec3d(newPos[0], newPos[1], newPos[2]));
-
-      double midlat = geoc.getLatitudeDeg();
-      double midlon = geoc.getLongitudeDeg();
+      SGGeod geod = SGGeod::fromCart(SGVec3d(newPos[0], newPos[1], newPos[2]));
 
       prevNode = tmpNode;
-      tmpNode = globals->get_airwaynet()->findNearestNode(midlat, midlon);
+      tmpNode = globals->get_airwaynet()->findNearestNode(geod);
 
       FGNode* node = globals->get_airwaynet()->findNode(tmpNode);
-      SGGeoc nodePos(SGGeoc::fromGeod(node->getPosition()));
     
-      if ((tmpNode != prevNode) && (SGGeodesy::distanceM(geoc, nodePos) < 25000)) {
+      if ((tmpNode != prevNode) && (SGGeodesy::distanceM(geod, node->getPosition()) < 25000)) {
         nodes.push_back(tmpNode);
       }
     }
index 32e08ac03cf30ea02f497ae548d7c3b51c43b7f5..ab8ec1177b5c2a01602f4a16ab5eed9ac379d53b 100755 (executable)
@@ -32,6 +32,7 @@
 #include <simgear/debug/logstream.hxx>
 #include <simgear/misc/sgstream.hxx>
 #include <simgear/route/waypoint.hxx>
+#include <simgear/misc/sg_path.hxx>
 
 #include "awynet.hxx"
 
@@ -47,18 +48,19 @@ FGNode::FGNode()
 {
 }
 
-FGNode::FGNode(double lt, double ln, int idx, std::string id) :
+FGNode::FGNode(const SGGeod& aPos, int idx, std::string id) :
   ident(id),
-  geod(SGGeod::fromDeg(ln, lt)),
+  geod(aPos),
   index(idx)
 {
+  cart = SGVec3d::fromGeod(geod);
 }
 
-bool FGNode::matches(string id, double lt, double ln)
+bool FGNode::matches(std::string id, const SGGeod& aPos)
 {
   if ((ident == id) &&
-      (fabs(lt - geod.getLatitudeDeg()) < 1.0) &&
-      (fabs(ln - geod.getLongitudeDeg()) < 1.0))
+      (fabs(aPos.getLatitudeDeg() - geod.getLatitudeDeg()) < 1.0) &&
+      (fabs(aPos.getLongitudeDeg() - geod.getLongitudeDeg()) < 1.0))
     return true;
   else
     return false;
@@ -195,9 +197,9 @@ void FGAirwayNetwork::init()
 }
 
 
-void FGAirwayNetwork::load(SGPath path)
+void FGAirwayNetwork::load(const SGPath& path)
 {
-  string identStart, identEnd, token, name;
+  std::string identStart, identEnd, token, name;
   double latStart, lonStart, latEnd, lonEnd;
   int type, base, top;
   int airwayIndex = 0;
@@ -272,7 +274,8 @@ void FGAirwayNetwork::load(SGPath path)
       node_map_iterator itr = nodesMap.find(string(buffer));
       if (itr == nodesMap.end()) {
        startIndex = nodes.size();
-       n = new FGNode(latStart, lonStart, startIndex, identStart);
+  SGGeod startPos(SGGeod::fromDeg(lonStart, latStart));
+       n = new FGNode(startPos, startIndex, identStart);
        nodesMap[string(buffer)] = n;
        nodes.push_back(n);
        //cout << "Adding node: " << identStart << endl;
@@ -287,7 +290,8 @@ void FGAirwayNetwork::load(SGPath path)
       itr = nodesMap.find(string(buffer));
       if (itr == nodesMap.end()) {
        endIndex = nodes.size();
-       n = new FGNode(latEnd, lonEnd, endIndex, identEnd);
+  SGGeod endPos(SGGeod::fromDeg(lonEnd, latEnd));
+       n = new FGNode(endPos, endIndex, identEnd);
        nodesMap[string(buffer)] = n;
        nodes.push_back(n);
        //cout << "Adding node: " << identEnd << endl;
@@ -310,32 +314,23 @@ void FGAirwayNetwork::load(SGPath path)
     }
   }
 
-  int FGAirwayNetwork::findNearestNode(double lat, double lon)
+int FGAirwayNetwork::findNearestNode(const SGGeod& aPos)
 {
   double minDist = HUGE_VAL;
-  double distsqrt, lat2, lon2;
   int index;
+  SGVec3d cart = SGVec3d::fromGeod(aPos);
+  
   //cerr << "Lat " << lat << " lon " << lon << endl;
   for (FGNodeVectorIterator
         itr = nodes.begin();
        itr != nodes.end(); itr++)
     {
-      lat2 = (*itr)->getLatitude();
-      lon2 = (*itr)->getLongitude();
-      // Note: This equation should adjust for decreasing distance per longitude
-      // with increasing lat.
-      distsqrt =
-       (lat-lat2)*(lat-lat2) +
-       (lon-lon2)*(lon-lon2);
-
-      if (distsqrt < minDist)
-       {
-         minDist = distsqrt;
-         //cerr << "Test" << endl;
-         index = (*itr)->getIndex();
-         //cerr << "Minimum distance of " << minDist << " for index " << index << endl;
-         //cerr << (*itr)->getLatitude() << " " << (*itr)->getLongitude() << endl;
-       }
+      double d2 = distSqr(cart, (*itr)->getCart());
+      if (d2 < minDist)
+      {
+        minDist = d2;
+                 index = (*itr)->getIndex();
+      }
       //cerr << (*itr)->getIndex() << endl;
     }
   //cerr << " returning  " << index << endl;
index 81bc073a9a9c08c22290f6fcbeb1e05bd5a619f2..9ac508204928218661b83d49ebabef903731c45b 100755 (executable)
 #include <map>
 #include <vector>
 
-#include <simgear/misc/sg_path.hxx>
 #include <simgear/misc/sgstream.hxx>
 
 
 //#include "parking.hxx"
 
 class FGAirway; // forward reference
+class SGPath;
+class SGGeod;
 
 typedef std::vector<FGAirway>  FGAirwayVector;
 typedef std::vector<FGAirway *> FGAirwayPointerVector;
@@ -51,28 +52,26 @@ class FGNode
 private:
   std::string ident;
   SGGeod geod;
+  SGVec3d cart; // cached cartesian position
   int index;
   FGAirwayPointerVector next; // a vector to all the segments leaving from this node
 
 public:
   FGNode();
-  FGNode(double lt, double ln, int idx, std::string id);
+  FGNode(const SGGeod& aPos, int idx, std::string id);
 
   void setIndex(int idx)                  { index = idx;};
   void addAirway(FGAirway *segment) { next.push_back(segment); };
 
-  double getLatitude() { return geod.getLatitudeDeg();};
-  double getLongitude(){ return geod.getLongitudeDeg();};
-
   const SGGeod& getPosition() {return geod;}
-
+  const SGVec3d& getCart() { return cart; }
   int getIndex() { return index; };
   std::string getIdent() { return ident; };
   FGNode *getAddress() { return this;};
   FGAirwayPointerVectorIterator getBeginRoute() { return next.begin(); };
   FGAirwayPointerVectorIterator getEndRoute()   { return next.end();   };
 
-  bool matches(std::string ident, double lat, double lon);
+  bool matches(std::string ident, const SGGeod& aPos);
 };
 
 typedef std::vector<FGNode *> FGNodeVector;
@@ -191,12 +190,12 @@ public:
 
   void init();
   bool exists() { return hasNetwork; };
-  int findNearestNode(double lat, double lon);
+  int findNearestNode(const SGGeod& aPos);
   FGNode *findNode(int idx);
   FGAirRoute findShortestRoute(int start, int end);
   void trace(FGNode *, int, int, double dist);
 
-  void load(SGPath path);
+  void load(const SGPath& path);
 };
 
 #endif