- char buffer[12];
- for (int i = 1; i < 10; i++) {
- snprintf(buffer, 12, "wpt%d", i);
- coord = rwy->pointOnCenterline(rwy->lengthM() * (i / 10.0));
- wpt = createOnGround(ac, buffer, coord, aptElev, (vTouchdown / i));
- wpt->crossat = apt->getElevation();
- waypoints.push_back(wpt);
+
+
+ /*double distanceOut = rwy->lengthM() * .1;
+ double nPoints = 20;
+ for (int i = 1; i < nPoints; i++) {
+ snprintf(buffer, 12, "flare%d", i);
+ double currentDist = i * (distanceOut / nPoints);
+ double currentAltitude = apt->getElevation() + 20 - (i * 20 / nPoints);
+ coord = rwy->pointOnCenterline((currentDist * (i / nPoints)));
+ wpt = createInAir(ac, buffer, coord, currentAltitude, (vTouchdown));
+ }*/
+ double rolloutDistance =
+ (vTouchdownMetric * vTouchdownMetric - vTaxiMetric * vTaxiMetric) / (2 * decelMetric);
+ //cerr << " touchdown speed = " << vTouchdown << ". Rollout distance " << rolloutDistance << endl;
+ int nPoints = 50;
+ for (int i = 1; i < nPoints; i++) {
+ snprintf(buffer, 12, "landing03%d", i);
+
+ coord = rwy->pointOnCenterline((rolloutDistance * ((double) i / (double) nPoints)));
+ wpt = createOnGround(ac, buffer, coord, currElev, 2*vTaxi);
+ wpt->setCrossat(currElev);
+ pushBackWaypoint(wpt);
+ }
+ wpt->setSpeed(vTaxi);
+ double mindist = 1.1 * rolloutDistance;
+ double maxdist = rwy->lengthM();
+ //cerr << "Finding nearest exit" << endl;
+ FGGroundNetwork *gn = apt->getDynamics()->getGroundNetwork();
+ if (gn) {
+ double min = 0;
+ for (int i = ceil(mindist); i < floor(maxdist); i++) {
+ coord = rwy->pointOnCenterline(mindist);
+ int nodeId = 0;
+ if (gn->getVersion() > 0) {
+ nodeId = gn->findNearestNodeOnRunway(coord);
+ } else {
+ nodeId = gn->findNearestNode(coord);
+ }
+ if (tn)
+ tn = gn->findNode(nodeId);
+ if (!tn)
+ break;
+
+ double dist = SGGeodesy::distanceM(coord, tn->geod());
+ if (dist < (min + 0.75)) {
+ break;
+ }
+ min = dist;
+ }
+ if (tn) {
+ wpt = createOnGround(ac, buffer, tn->geod(), currElev, vTaxi);
+ pushBackWaypoint(wpt);
+ }