public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); var dV = OrbitalManeuverCalculator.DeltaVToShiftNodeLongitude(o, UT, target.targetLongitude); return(new ManeuverParameters(dV, UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); if (!target.NormalTargetExists) { throw new Exception("must select a target to match planes with."); } else if (o.referenceBody != target.TargetOrbit.referenceBody) { throw new Exception("can only match planes with an object in the same sphere of influence."); } else if (timeSelector.timeReference == TimeReference.REL_ASCENDING) { if (!o.AscendingNodeExists(target.TargetOrbit)) { throw new Exception("ascending node with target doesn't exist."); } } else { if (!o.DescendingNodeExists(target.TargetOrbit)) { throw new Exception("descending node with target doesn't exist."); } } Vector3d dV = (timeSelector.timeReference == TimeReference.REL_ASCENDING) ? OrbitalManeuverCalculator.DeltaVAndTimeToMatchPlanesAscending(o, target.TargetOrbit, UT, out UT): OrbitalManeuverCalculator.DeltaVAndTimeToMatchPlanesDescending(o, target.TargetOrbit, UT, out UT); return(new ManeuverParameters(dV, UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); var dV = OrbitalManeuverCalculator.DeltaVToResonantOrbit(o, UT, (double)resonanceNumerator.val / resonanceDenominator.val); return(new ManeuverParameters(dV, UT)); }
public override List <ManeuverParameters> MakeNodesImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); List <ManeuverParameters> NodeList = new List <ManeuverParameters>(); NodeList.Add(new ManeuverParameters(OrbitalManeuverCalculator.DeltaVToCircularize(o, UT), UT)); return(NodeList); }
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)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); if (o.referenceBody.Radius + newApA < o.Radius(UT)) { string burnAltitude = MuUtils.ToSI(o.Radius(UT) - o.referenceBody.Radius) + "m"; throw new OperationException(Localizer.Format("#MechJeb_Ap_Exception", burnAltitude));//new apoapsis cannot be lower than the altitude of the burn (<<1>>) } return(new ManeuverParameters(OrbitalManeuverCalculator.DeltaVToChangeApoapsis(o, UT, newApA + o.referenceBody.Radius), UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); if (2 * newSMA > o.Radius(UT) + o.referenceBody.sphereOfInfluence) { errorMessage = Localizer.Format("#MechJeb_Sa_errormsg");//Warning: new Semi-Major Axis is very large, and may result in a hyberbolic orbit } if (o.Radius(UT) > 2 * newSMA) { throw new OperationException(Localizer.Format("#MechJeb_Sa_Exception") + o.referenceBody.displayName + "(" + MuUtils.ToSI(o.referenceBody.Radius, 3) + "m)");//cannot make Semi-Major Axis less than twice the burn altitude plus the radius of } return(new ManeuverParameters(OrbitalManeuverCalculator.DeltaVForSemiMajorAxis(o, UT, newSMA), UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { if (!target.NormalTargetExists) { throw new OperationException(Localizer.Format("#MechJeb_match_v_Exception1"));//must select a target to match velocities with. } else if (o.referenceBody != target.TargetOrbit.referenceBody) { throw new OperationException(Localizer.Format("#MechJeb_match_v_Exception2"));//target must be in the same sphere of influence. } double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); var dV = OrbitalManeuverCalculator.DeltaVToMatchVelocities(o, UT, target.TargetOrbit); return(new ManeuverParameters(dV, UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); if (o.referenceBody.Radius + newPeA > o.Radius(UT)) { string burnAltitude = MuUtils.ToSI(o.Radius(UT) - o.referenceBody.Radius) + "m"; throw new Exception("new periapsis cannot be higher than the altitude of the burn (" + burnAltitude + ")"); } else if (newPeA < -o.referenceBody.Radius) { throw new Exception("new periapsis cannot be lower than minus the radius of " + o.referenceBody.theName + "(-" + MuUtils.ToSI(o.referenceBody.Radius, 3) + "m)"); } return(new ManeuverParameters(OrbitalManeuverCalculator.DeltaVToChangePeriapsis(o, UT, newPeA + o.referenceBody.Radius), UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { if (!target.NormalTargetExists) { throw new Exception("must select a target to intercept."); } if (o.referenceBody != target.TargetOrbit.referenceBody) { throw new Exception("target must be in the same sphere of influence."); } double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); var dV = OrbitalManeuverCalculator.DeltaVToInterceptAtTime(o, UT, target.TargetOrbit, UT + interceptInterval); return(new ManeuverParameters(dV, UT)); }
public override List <ManeuverParameters> MakeNodesImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { if (!target.NormalTargetExists) { throw new OperationException(Localizer.Format("#MechJeb_intercept_Exception1"));//must select a target to intercept. } if (o.referenceBody != target.TargetOrbit.referenceBody) { throw new OperationException(Localizer.Format("#MechJeb_intercept_Exception2"));//target must be in the same sphere of influence. } double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); var dV = OrbitalManeuverCalculator.DeltaVToInterceptAtTime(o, UT, target.TargetOrbit, UT + interceptInterval); List <ManeuverParameters> NodeList = new List <ManeuverParameters>(); NodeList.Add(new ManeuverParameters(dV, UT)); return(NodeList); }
public override List <ManeuverParameters> MakeNodesImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); if (o.referenceBody.Radius + newPeA > o.Radius(UT)) { string burnAltitude = MuUtils.ToSI(o.Radius(UT) - o.referenceBody.Radius) + "m"; throw new OperationException(Localizer.Format("#MechJeb_Pe_Exception1") + " (" + burnAltitude + ")");//new periapsis cannot be higher than the altitude of the burn } else if (newPeA < -o.referenceBody.Radius) { throw new OperationException(Localizer.Format("#MechJeb_Pe_Exception2", o.referenceBody.displayName) + "(-" + MuUtils.ToSI(o.referenceBody.Radius, 3) + "m)");//new periapsis cannot be lower than minus the radius of <<1>> } List <ManeuverParameters> NodeList = new List <ManeuverParameters>(); NodeList.Add(new ManeuverParameters(OrbitalManeuverCalculator.DeltaVToChangePeriapsis(o, UT, newPeA + o.referenceBody.Radius), UT)); return(NodeList); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); string burnAltitude = MuUtils.ToSI(o.Radius(UT) - o.referenceBody.Radius) + "m"; if (o.referenceBody.Radius + newPeA > o.Radius(UT)) { throw new OperationException(Localizer.Format("#MechJeb_both_Exception1", burnAltitude));//new periapsis cannot be higher than the altitude of the burn (<<1>>) } else if (o.referenceBody.Radius + newApA < o.Radius(UT)) { throw new OperationException(Localizer.Format("#MechJeb_both_Exception2") + "(" + burnAltitude + ")");//new apoapsis cannot be lower than the altitude of the burn } else if (newPeA < -o.referenceBody.Radius) { throw new OperationException(Localizer.Format("#MechJeb_both_Exception3") + o.referenceBody.displayName + "(-" + MuUtils.ToSI(o.referenceBody.Radius, 3) + "m)");//"new periapsis cannot be lower than minus the radius of " } return(new ManeuverParameters(OrbitalManeuverCalculator.DeltaVToEllipticize(o, UT, newPeA + o.referenceBody.Radius, newApA + o.referenceBody.Radius), UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = 0; if (!target.NormalTargetExists) { throw new OperationException("must select a target for the bi-impulsive transfer."); } else if (o.referenceBody != target.TargetOrbit.referenceBody) { throw new OperationException("target for bi-impulsive transfer must be in the same sphere of influence."); } var anExists = o.AscendingNodeExists(target.TargetOrbit); var dnExists = o.DescendingNodeExists(target.TargetOrbit); double anTime = o.TimeOfAscendingNode(target.TargetOrbit, universalTime); double dnTime = o.TimeOfDescendingNode(target.TargetOrbit, universalTime); if (timeSelector.timeReference == TimeReference.REL_ASCENDING) { if (!anExists) { throw new OperationException("ascending node with target doesn't exist."); } UT = anTime; } else if (timeSelector.timeReference == TimeReference.REL_DESCENDING) { if (!dnExists) { throw new OperationException("descending node with target doesn't exist."); } UT = dnTime; } else if (timeSelector.timeReference == TimeReference.REL_NEAREST_AD) { if (!anExists && !dnExists) { throw new OperationException("neither ascending nor descending node with target exists."); } if (!dnExists || anTime <= dnTime) { UT = anTime; } else { UT = dnTime; } } else if (timeSelector.timeReference != TimeReference.COMPUTED) { UT = timeSelector.ComputeManeuverTime(o, universalTime, target); } Vector3d dV; if (timeSelector.timeReference == TimeReference.COMPUTED) { dV = OrbitalManeuverCalculator.DeltaVAndTimeForBiImpulsiveAnnealed(o, target.TargetOrbit, universalTime, out UT, intercept_only: intercept_only); } else { dV = OrbitalManeuverCalculator.DeltaVAndTimeForBiImpulsiveAnnealed(o, target.TargetOrbit, UT, out UT, intercept_only: intercept_only, fixed_ut: true); } return(new ManeuverParameters(dV, UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); return(new ManeuverParameters(OrbitalManeuverCalculator.DeltaVToChangeInclination(o, UT, newInc), UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = timeSelector.ComputeManeuverTime(o, universalTime, target); if (!target.NormalTargetExists) { throw new OperationException(Localizer.Format("#MechJeb_match_planes_Exception1"));//must select a target to match planes with. } else if (o.referenceBody != target.TargetOrbit.referenceBody) { throw new OperationException(Localizer.Format("#MechJeb_match_planes_Exception2"));//can only match planes with an object in the same sphere of influence. } var anExists = o.AscendingNodeExists(target.TargetOrbit); var dnExists = o.DescendingNodeExists(target.TargetOrbit); double anTime = 0; double dnTime = 0; var anDeltaV = anExists ? OrbitalManeuverCalculator.DeltaVAndTimeToMatchPlanesAscending(o, target.TargetOrbit, UT, out anTime) : Vector3d.zero; var dnDeltaV = anExists ? OrbitalManeuverCalculator.DeltaVAndTimeToMatchPlanesDescending(o, target.TargetOrbit, UT, out dnTime) : Vector3d.zero; Vector3d dV; if (timeSelector.timeReference == TimeReference.REL_ASCENDING) { if (!anExists) { throw new OperationException(Localizer.Format("#MechJeb_match_planes_Exception3"));//ascending node with target doesn't exist. } UT = anTime; dV = anDeltaV; } else if (timeSelector.timeReference == TimeReference.REL_DESCENDING) { if (!dnExists) { throw new OperationException(Localizer.Format("#MechJeb_match_planes_Exception4"));//descending node with target doesn't exist. } UT = dnTime; dV = dnDeltaV; } else if (timeSelector.timeReference == TimeReference.REL_NEAREST_AD) { if (!anExists && !dnExists) { throw new OperationException(Localizer.Format("#MechJeb_match_planes_Exception5"));//neither ascending nor descending node with target exists. } if (!dnExists || anTime <= dnTime) { UT = anTime; dV = anDeltaV; } else { UT = dnTime; dV = dnDeltaV; } } else if (timeSelector.timeReference == TimeReference.REL_HIGHEST_AD) { if (!anExists && !dnExists) { throw new OperationException(Localizer.Format("#MechJeb_match_planes_Exception5"));//neither ascending nor descending node with target exists. } if (!dnExists || anDeltaV.magnitude <= dnDeltaV.magnitude) { UT = anTime; dV = anDeltaV; } else { UT = dnTime; dV = dnDeltaV; } } else { throw new OperationException(Localizer.Format("#MechJeb_match_planes_Exception6"));//wrong time reference. } return(new ManeuverParameters(dV, UT)); }
public override ManeuverParameters MakeNodeImpl(Orbit o, double universalTime, MechJebModuleTargetController target) { double UT = 0; if (!target.NormalTargetExists) { throw new OperationException(Localizer.Format("#MechJeb_Hohm_Exception1"));//must select a target for the bi-impulsive transfer. } else if (o.referenceBody != target.TargetOrbit.referenceBody) { throw new OperationException(Localizer.Format("#MechJeb_Hohm_Exception2"));//target for bi-impulsive transfer must be in the same sphere of influence. } Vector3d dV; Orbit targetOrbit = target.TargetOrbit; if (periodOffset != 0) { targetOrbit = target.TargetOrbit.Clone(); targetOrbit.MutatedOrbit(periodOffset: periodOffset); } if (simpleTransfer) { dV = OrbitalManeuverCalculator.DeltaVAndTimeForHohmannTransfer(o, targetOrbit, universalTime, out UT); } else { if (timeSelector.timeReference == TimeReference.COMPUTED) { dV = OrbitalManeuverCalculator.DeltaVAndTimeForBiImpulsiveAnnealed(o, targetOrbit, universalTime, out UT, intercept_only: intercept_only); } else { var anExists = o.AscendingNodeExists(target.TargetOrbit); var dnExists = o.DescendingNodeExists(target.TargetOrbit); double anTime = o.TimeOfAscendingNode(target.TargetOrbit, universalTime); double dnTime = o.TimeOfDescendingNode(target.TargetOrbit, universalTime); if (timeSelector.timeReference == TimeReference.REL_ASCENDING) { if (!anExists) { throw new OperationException(Localizer.Format("#MechJeb_Hohm_Exception3"));//ascending node with target doesn't exist. } UT = anTime; } else if (timeSelector.timeReference == TimeReference.REL_DESCENDING) { if (!dnExists) { throw new OperationException(Localizer.Format("#MechJeb_Hohm_Exception4"));//descending node with target doesn't exist. } UT = dnTime; } else if (timeSelector.timeReference == TimeReference.REL_NEAREST_AD) { if (!anExists && !dnExists) { throw new OperationException(Localizer.Format("#MechJeb_Hohm_Exception5"));//neither ascending nor descending node with target exists. } if (!dnExists || anTime <= dnTime) { UT = anTime; } else { UT = dnTime; } } UT = timeSelector.ComputeManeuverTime(o, universalTime, target); dV = OrbitalManeuverCalculator.DeltaVAndTimeForBiImpulsiveAnnealed(o, targetOrbit, UT, out UT, intercept_only: intercept_only, fixed_ut: true); } } return(new ManeuverParameters(dV, UT)); }