private void TurnOrbit(double theta) { var maneuverPos = CurrentNode.patch.getRelativePositionAtUT(CurrentNode.UT).xzy; var maneuverVel = CurrentNode.patch.getOrbitalVelocityAtUT(CurrentNode.UT).xzy; if (maneuverPos.NotNAN() && !maneuverPos.IsZero() && maneuverVel.NotNAN()) { var nprog = maneuverVel.normalized; var nnorm = Vector3d.Cross(maneuverVel, maneuverPos).normalized; var nrad = Vector3d.Cross(nnorm, nprog); if (!nprog.IsZero() && !nnorm.IsZero() && !nrad.IsZero()) { var dv = CurrentNode.DeltaV; var calcVel = maneuverVel + nrad * dv.x + nnorm * dv.y + nprog * dv.z; NodeTools.TurnVector(ref calcVel, maneuverPos, theta); var newDV = calcVel - maneuverVel; CurrentSavedNode.UpdateDvAbs(Vector3d.Dot(newDV, nrad), Vector3d.Dot(newDV, nnorm), Vector3d.Dot(newDV, nprog)); return; } } // position and velocity are perfectly parallel (less probable) // or // KSP API returned NaN or some other weird shit (much more probable) ScreenMessages.PostScreenMessage(KSP.Localization.Localizer.Format("precisemaneuver_erroneous_orbit"), 2.0f, ScreenMessageStyle.UPPER_CENTER); }
internal void CircularizeOrbit() { var maneuverPos = CurrentNode.patch.getRelativePositionAtUT(CurrentNode.UT).xzy; var maneuverVel = CurrentNode.patch.getOrbitalVelocityAtUT(CurrentNode.UT).xzy; if (maneuverPos.NotNAN() && !maneuverPos.IsZero() && maneuverVel.NotNAN()) { var nprog = maneuverVel.normalized; var nnorm = Vector3d.Cross(maneuverVel, maneuverPos).normalized; var nrad = Vector3d.Cross(nnorm, nprog); var curVel = CurrentNode.nextPatch.getOrbitalVelocityAtUT(CurrentNode.UT).xzy; if (!nprog.IsZero() && !nnorm.IsZero() && !nrad.IsZero() && curVel.NotNAN()) { double rezSpeed = Math.Sqrt(CurrentNode.patch.referenceBody.gravParameter / maneuverPos.magnitude); var normVel = Vector3d.Cross(maneuverPos, curVel); var newVel = Vector3d.Cross(normVel, maneuverPos).normalized *rezSpeed; var newDV = newVel - maneuverVel; CurrentSavedNode.UpdateDvAbs(Vector3d.Dot(newDV, nrad), Vector3d.Dot(newDV, nnorm), Vector3d.Dot(newDV, nprog)); return; } } // position and velocity are perfectly parallel (less probable) // or // KSP API returned NaN or some other weird shit (much more probable) ScreenMessages.PostScreenMessage(KSP.Localization.Localizer.Format("precisemaneuver_erroneous_orbit"), 2.0f, ScreenMessageStyle.UPPER_CENTER); }
internal void LoadPreset(string name) { var dv = PreciseManeuverConfig.Instance.GetPreset(name); CurrentSavedNode.UpdateDvAbs(dv.x, dv.y, dv.z); }