public ApoapsisPeriapsisPrediction predictOrbit() { VesselController.setReferenceFrameType(VesselController.ReferenceFrameType.ClosestBodyCenter); VesselController.updateBodyPosition(); var currentPosition = VesselController.getPosition(); var currentVelocity = VesselController.getVelocity(); float stepsize = 1.0f; float time = 0.0f; double min = 99999999990.0; double max = 0.0; double last = VesselController.getAltitudeAtPoint(currentPosition); int direction = 0; int changes = 0; double timeToApo = 0.0; double timeToPeri = 0.0; while (true) { var gravity = VesselController.getGravityAtPoint(currentPosition); var gravityLength = gravity.Length(); //Console.WriteLine(gravity.Length()); currentVelocity += gravity * stepsize; currentPosition += currentVelocity * stepsize; double newAltitude = VesselController.getAltitudeAtPoint(currentPosition); time += stepsize; if (newAltitude < min) { min = newAltitude; timeToPeri = time; } if (newAltitude > max) { max = newAltitude; timeToApo = time; } if (direction == 0) { direction = newAltitude < last ? -1 : 1; changes++; } else if (direction == 1 && gravityLength < last) { changes++; direction = -1; } else if (direction == -1 && gravityLength >= last) { changes++; direction = 1; } last = last * 0.999 + 0.001 * gravityLength; if (changes > 3) { break; } if (newAltitude < 0) { break; } } VesselController.setReferenceFrameType(VesselController.ReferenceFrameType.ClosestBodySurface); VesselController.updateBodyPosition(); return(new ApoapsisPeriapsisPrediction() { Apoapsis = max, Periapsis = min, TimeToApoapsis = timeToApo, TimeToPeriapsis = timeToPeri }); }