#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;
bool sortByHeadingDiff(FGTaxiSegment *a, FGTaxiSegment *b);
bool sortByLength (FGTaxiSegment *a, FGTaxiSegment *b);
-double processPosition(const string& pos);
-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
+ // used in way finding - should really move to a dynamic struct
double pathScore;
FGTaxiNode* previousNode;
FGTaxiSegment* previousSeg;
-public:
- FGTaxiNode() :
- lat (0.0),
- lon (0.0),
- index(0),
- isOnRunway(false),
- holdType(0),
- pathScore(0),
- previousNode(0),
- previousSeg(0)
-{
-};
- FGTaxiNode(const FGTaxiNode &other) :
- lat(other.lat),
- lon(other.lon),
- index(other.index),
- isOnRunway(other.isOnRunway),
- holdType(other.holdType),
- next(other.next),
- pathScore(other.pathScore),
- previousNode(other.previousNode),
- previousSeg(other.previousSeg)
-{
-};
-
-FGTaxiNode &operator =(const FGTaxiNode &other)
-{
- lat = other.lat;
- lon = other.lon;
- index = other.index;
- isOnRunway = other.isOnRunway;
- holdType = other.holdType;
- next = other.next;
- pathScore = other.pathScore;
- previousNode = other.previousNode;
- previousSeg = other.previousSeg;
- return *this;
-};
-
- 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); };
+public:
+ FGTaxiNode(PositionedID aGuid, int index, const SGGeod& pos, bool aOnRunway, int aHoldType);
+ virtual ~FGTaxiNode();
+
+ void setElevation(double val);
void addSegment(FGTaxiSegment *segment) { next.push_back(segment); };
- void setHoldPointType(int val) { holdType = val; };
- void setOnRunway(bool val) { isOnRunway = val; };
void setPathScore (double val) { pathScore = val; };
void setPreviousNode(FGTaxiNode *val) { previousNode = val; };
FGTaxiSegment *getPreviousSegment() { return previousSeg; };
double getPathScore() { return pathScore; };
- double getLatitude() { return lat;};
- double getLongitude(){ return lon;};
-
- int getIndex() { return index; };
- int getHoldPointType() { return holdType; };
- bool getIsOnRunway() { return isOnRunway; };
- FGTaxiNode *getAddress() { return this;};
- FGTaxiSegmentVectorIterator getBeginRoute() { return next.begin(); };
- FGTaxiSegmentVectorIterator getEndRoute() { return next.end(); };
+ double getElevationM (double refelev);
+ double getElevationFt(double refelev);
+
+ int getIndex() const { return index; };
+ int getHoldPointType() const { return holdType; };
+ bool getIsOnRunway() const { return isOnRunway; };
+
+ 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);
};
-typedef vector<FGTaxiNode*> FGTaxiNodeVector;
+typedef SGSharedPtr<FGTaxiNode> FGTaxiNode_ptr;
+typedef std::vector<FGTaxiNode_ptr> FGTaxiNodeVector;
typedef FGTaxiNodeVector::iterator FGTaxiNodeVectorIterator;
#endif