public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { if (o.inclination < 10) { errorMessage = Localizer.Format("#MechJeb_AN_error", o.inclination);//"Warning: orbital plane has a low inclination of <<1>>º (recommend > 10º) and so maneuver may not be accurate" } double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); var dV = OrbitalManeuverCalculator.DeltaVToShiftLAN(o, UT, target.targetLongitude); return(new ManeuverParameters(dV, UT)); }
void MakeNodeForOperation(Orbit o, double UT, Operation op, double newPeA, double newApA, double newInc, double courseCorrectFinalPeA, double moonReturnAltitude, double interceptInterval) { Vector3d dV = Vector3d.zero; double bodyRadius = o.referenceBody.Radius; // print(newPeA + " - " + this.newPeA + "\n" + // newApA + " - " + this.newApA + "\n" + // newInc + " - " + this.newInc + "\n" + // courseCorrectFinalPeA + " - " + this.courseCorrectFinalPeA + "\n" + // moonReturnAltitude + " - " + this.moonReturnAltitude + "\n" + // interceptInterval + " - " + this.interceptInterval); switch (op) { case Operation.CIRCULARIZE: dV = OrbitalManeuverCalculator.DeltaVToCircularize(o, UT); break; case Operation.ELLIPTICIZE: dV = OrbitalManeuverCalculator.DeltaVToEllipticize(o, UT, newPeA + bodyRadius, newApA + bodyRadius); break; case Operation.PERIAPSIS: dV = OrbitalManeuverCalculator.DeltaVToChangePeriapsis(o, UT, newPeA + bodyRadius); break; case Operation.APOAPSIS: dV = OrbitalManeuverCalculator.DeltaVToChangeApoapsis(o, UT, newApA + bodyRadius); break; case Operation.INCLINATION: dV = OrbitalManeuverCalculator.DeltaVToChangeInclination(o, UT, newInc); break; case Operation.PLANE: if (timeReference == TimeReference.REL_ASCENDING) { dV = OrbitalManeuverCalculator.DeltaVAndTimeToMatchPlanesAscending(o, core.target.TargetOrbit, UT, out UT); } else { dV = OrbitalManeuverCalculator.DeltaVAndTimeToMatchPlanesDescending(o, core.target.TargetOrbit, UT, out UT); } break; case Operation.TRANSFER: dV = OrbitalManeuverCalculator.DeltaVAndTimeForHohmannTransfer(o, core.target.TargetOrbit, UT, out UT); break; case Operation.MOON_RETURN: dV = OrbitalManeuverCalculator.DeltaVAndTimeForMoonReturnEjection(o, UT, o.referenceBody.referenceBody.Radius + moonReturnAltitude, out UT); break; case Operation.COURSE_CORRECTION: CelestialBody targetBody = core.target.Target as CelestialBody; if (targetBody != null) { dV = OrbitalManeuverCalculator.DeltaVAndTimeForCheapestCourseCorrection(o, UT, core.target.TargetOrbit, targetBody, targetBody.Radius + courseCorrectFinalPeA, out UT); } else { dV = OrbitalManeuverCalculator.DeltaVAndTimeForCheapestCourseCorrection(o, UT, core.target.TargetOrbit, interceptDistance, out UT); } break; case Operation.INTERPLANETARY_TRANSFER: dV = OrbitalManeuverCalculator.DeltaVAndTimeForInterplanetaryTransferEjection(o, UT, core.target.TargetOrbit, true, out UT); break; case Operation.LAMBERT: dV = OrbitalManeuverCalculator.DeltaVToInterceptAtTime(o, UT, core.target.TargetOrbit, UT + interceptInterval); break; case Operation.KILL_RELVEL: dV = OrbitalManeuverCalculator.DeltaVToMatchVelocities(o, UT, core.target.TargetOrbit); break; case Operation.RESONANT_ORBIT: dV = OrbitalManeuverCalculator.DeltaVToResonantOrbit(o, UT, (double)resonanceNumerator.val / resonanceDenominator.val); break; case Operation.SEMI_MAJOR: dV = OrbitalManeuverCalculator.DeltaVForSemiMajorAxis(o, UT, newSMA); break; case Operation.LAN: dV = OrbitalManeuverCalculator.DeltaVToShiftLAN(o, UT, core.target.targetLongitude); break; } vessel.PlaceManeuverNode(o, dV, UT); }