X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIFlightPlan.cxx;h=0f99e7a9ef5b6287c966d4ea1f26e19232fcef69;hb=b796df3bd7d8fa6998a30ed033198a41a63a32b7;hp=e87d11530ab3a4eb485359604b73827796e88c2a;hpb=b5025ccf5d1dbe5e1dff3b24710ad70deee78558;p=flightgear.git diff --git a/src/AIModel/AIFlightPlan.cxx b/src/AIModel/AIFlightPlan.cxx index e87d11530..0f99e7a9e 100644 --- a/src/AIModel/AIFlightPlan.cxx +++ b/src/AIModel/AIFlightPlan.cxx @@ -71,7 +71,6 @@ bool FGAIWaypoint::contains(string target) { FGAIFlightPlan::FGAIFlightPlan() { - rwy = 0; sid = 0; repeat = false; distance_to_go = 0; @@ -128,7 +127,7 @@ FGAIFlightPlan::FGAIFlightPlan(const string& filename) if (wpt->getName() == "END") wpt->setFinished(true); else wpt->setFinished(false); - waypoints.push_back( wpt ); + pushBackWaypoint( wpt ); } wpt_iterator = waypoints.begin(); @@ -193,7 +192,7 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, SGPropertyNode * node = root.getNode("flightplan"); - //waypoints.push_back( init_waypoint ); + //pushBackWaypoint( init_waypoint ); for (int i = 0; i < node->nChildren(); i++) { //cout << "Reading waypoint " << i << endl; FGAIWaypoint* wpt = new FGAIWaypoint; @@ -209,7 +208,7 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, if (wpt->getName() == "END") wpt->setFinished(true); else wpt->setFinished(false); - waypoints.push_back(wpt); + pushBackWaypoint(wpt); } // of node loop wpt_iterator = waypoints.begin(); } catch (const sg_exception &e) { @@ -224,12 +223,12 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, time_t timeDiff = now-start; leg = 1; - if ((timeDiff > 60) && (timeDiff < 1200)) + if ((timeDiff > 60) && (timeDiff < 1500)) leg = 2; - else if ((timeDiff >= 1200) && (timeDiff < 1500)) { - leg = 3; - ac->setTakeOffStatus(2); - } + //else if ((timeDiff >= 1200) && (timeDiff < 1500)) { + //leg = 3; + //ac->setTakeOffStatus(2); + //} else if ((timeDiff >= 1500) && (timeDiff < 2000)) leg = 4; else if (timeDiff >= 2000) @@ -306,7 +305,7 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, { if ((dist > 100.0) && (useInitialWayPoint)) { - //waypoints.push_back(init_waypoint);; + //pushBackWaypoint(init_waypoint);; waypoints.insert(i, init_waypoint); //cerr << "Using waypoint : " << init_waypoint->name << endl; } @@ -314,7 +313,7 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, // { // (*i)->speed = dist; // A hack // } - //waypoints.push_back( wpt ); + //pushBackWaypoint( wpt ); //cerr << "Using waypoint : " << (*i)->name // << ": course diff : " << crsDiff // << "Course = " << course @@ -410,10 +409,19 @@ void FGAIFlightPlan::DecrementWaypoint(bool eraseWaypoints ) } else wpt_iterator--; +} +void FGAIFlightPlan::eraseLastWaypoint() +{ + delete (waypoints.back()); + waypoints.pop_back();; + wpt_iterator = waypoints.begin(); + wpt_iterator++; } + + // gives distance in feet from a position to a waypoint double FGAIFlightPlan::getDistanceToGo(double lat, double lon, FGAIWaypoint* wp) const{ return SGGeodesy::distanceM(SGGeod::fromDeg(lon, lat), @@ -505,10 +513,20 @@ void FGAIFlightPlan::resetWaypoints() wpt->setOn_ground ( (*i)->getOn_ground() ); //cerr << "Recycling waypoint " << wpt->name << endl; deleteWaypoints(); - waypoints.push_back(wpt); + pushBackWaypoint(wpt); } } +void FGAIFlightPlan::pushBackWaypoint(FGAIWaypoint *wpt) +{ + // std::vector::push_back invalidates waypoints + // so we should restore wpt_iterator after push_back + // (or it could be an index in the vector) + size_t pos = wpt_iterator - waypoints.begin(); + waypoints.push_back(wpt); + wpt_iterator = waypoints.begin() + pos; +} + // Start flightplan over from the beginning void FGAIFlightPlan::restart() { @@ -546,4 +564,12 @@ double FGAIFlightPlan::checkTrackLength(string wptName) { trackDistance = 0; // name not found } return trackDistance; -} \ No newline at end of file +} + +void FGAIFlightPlan::shortenToFirst(unsigned int number, string name) +{ + while (waypoints.size() > number + 3) { + eraseLastWaypoint(); + } + (waypoints.back())->setName((waypoints.back())->getName() + name); +}