#include <vector>
#include <string>
+
#include <simgear/compiler.h>
+#include <simgear/structure/SGSharedPtr.hxx>
-SG_USING_STD(string);
-SG_USING_STD(vector);
+#include <Navaids/positioned.hxx>
class FGTaxiSegment;
-typedef vector<FGTaxiSegment*> FGTaxiSegmentVector;
+
+typedef std::vector<FGTaxiSegment*> FGTaxiSegmentVector;
typedef FGTaxiSegmentVector::iterator FGTaxiSegmentVectorIterator;
-double processPosition(const string& pos);
+bool sortByHeadingDiff(FGTaxiSegment *a, FGTaxiSegment *b);
+bool sortByLength (FGTaxiSegment *a, FGTaxiSegment *b);
-class FGTaxiNode
+class FGTaxiNode : public FGPositioned
{
-private:
- double lat;
- double lon;
+protected:
int index;
+
+ bool isOnRunway;
+ int holdType;
FGTaxiSegmentVector next; // a vector of pointers to all the segments leaving from this node
+
+ // used in way finding - should really move to a dynamic struct
+ double pathScore;
+ FGTaxiNode* previousNode;
+ FGTaxiSegment* previousSeg;
+
+
+public:
+ FGTaxiNode(PositionedID aGuid, int index, const SGGeod& pos, bool aOnRunway, int aHoldType);
+ virtual ~FGTaxiNode();
-public:
- FGTaxiNode();
- FGTaxiNode(double, double, int);
-
- void setIndex(int idx) { index = idx;};
- void setLatitude (double val) { lat = val;};
- void setLongitude(double val) { lon = val;};
- void setLatitude (const string& val) { lat = processPosition(val); };
- void setLongitude(const string& val) { lon = processPosition(val); };
- void addSegment(FGTaxiSegment *segment) { next.push_back(segment); };
+ void setElevation(double val);
+ void addSegment(FGTaxiSegment *segment) { next.push_back(segment); };
+
+ void setPathScore (double val) { pathScore = val; };
+ void setPreviousNode(FGTaxiNode *val) { previousNode = val; };
+ void setPreviousSeg (FGTaxiSegment *val) { previousSeg = val; };
+
+ FGTaxiNode *getPreviousNode() { return previousNode; };
+ FGTaxiSegment *getPreviousSegment() { return previousSeg; };
+
+ double getPathScore() { return pathScore; };
+
+ double getElevationM (double refelev);
+ double getElevationFt(double refelev);
- double getLatitude() { return lat;};
- double getLongitude(){ return lon;};
+ int getIndex() const { return index; };
+ int getHoldPointType() const { return holdType; };
+ bool getIsOnRunway() const { return isOnRunway; };
- int getIndex() { return index; };
- FGTaxiNode *getAddress() { return this;};
- FGTaxiSegmentVectorIterator getBeginRoute() { return next.begin(); };
- FGTaxiSegmentVectorIterator getEndRoute() { return next.end(); };
+ const FGTaxiSegmentVector& arcs() const
+ { return next; }
+
+ /// find the arg which leads from this node to another.
+ /// returns NULL if no such arc exists.
+ FGTaxiSegment* getArcTo(FGTaxiNode* aEnd) const;
+
bool operator<(const FGTaxiNode &other) const { return index < other.index; };
- void sortEndSegments(bool);
- // used in way finding
- double pathscore;
- FGTaxiNode* previousnode;
- FGTaxiSegment* previousseg;
-
};
-typedef vector<FGTaxiNode*> FGTaxiNodeVector;
+typedef SGSharedPtr<FGTaxiNode> FGTaxiNode_ptr;
+typedef std::vector<FGTaxiNode_ptr> FGTaxiNodeVector;
typedef FGTaxiNodeVector::iterator FGTaxiNodeVectorIterator;
#endif