本文整理汇总了C#中Orbit.SwappedRelativePositionAtUT方法的典型用法代码示例。如果您正苦于以下问题:C# Orbit.SwappedRelativePositionAtUT方法的具体用法?C# Orbit.SwappedRelativePositionAtUT怎么用?C# Orbit.SwappedRelativePositionAtUT使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Orbit
的用法示例。
在下文中一共展示了Orbit.SwappedRelativePositionAtUT方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: DeltaVAndTimeForCheapestCourseCorrection
public static Vector3d DeltaVAndTimeForCheapestCourseCorrection(Orbit o, double UT, Orbit target, CelestialBody targetBody, double finalPeR, out double burnUT)
{
Vector3d collisionDV = DeltaVAndTimeForCheapestCourseCorrection(o, UT, target, out burnUT);
Orbit collisionOrbit = o.PerturbedOrbit(burnUT, collisionDV);
double collisionUT = collisionOrbit.NextClosestApproachTime(target, burnUT);
Vector3d collisionPosition = target.SwappedAbsolutePositionAtUT(collisionUT);
Vector3d collisionRelVel = collisionOrbit.SwappedOrbitalVelocityAtUT(collisionUT) - target.SwappedOrbitalVelocityAtUT(collisionUT);
double soiEnterUT = collisionUT - targetBody.sphereOfInfluence / collisionRelVel.magnitude;
Vector3d soiEnterRelVel = collisionOrbit.SwappedOrbitalVelocityAtUT(soiEnterUT) - target.SwappedOrbitalVelocityAtUT(soiEnterUT);
double E = 0.5 * soiEnterRelVel.sqrMagnitude - targetBody.gravParameter / targetBody.sphereOfInfluence; //total orbital energy on SoI enter
double finalPeSpeed = Math.Sqrt(2 * (E + targetBody.gravParameter / finalPeR)); //conservation of energy gives the orbital speed at finalPeR.
double desiredImpactParameter = finalPeR * finalPeSpeed / soiEnterRelVel.magnitude; //conservation of angular momentum gives the required impact parameter
Vector3d displacementDir = Vector3d.Cross(collisionRelVel, o.SwappedOrbitNormal()).normalized;
Vector3d interceptTarget = collisionPosition + desiredImpactParameter * displacementDir;
Vector3d velAfterBurn;
Vector3d arrivalVel;
LambertSolver.Solve(o.SwappedRelativePositionAtUT(burnUT), interceptTarget - o.referenceBody.position, collisionUT - burnUT, o.referenceBody, true, out velAfterBurn, out arrivalVel);
Vector3d deltaV = velAfterBurn - o.SwappedOrbitalVelocityAtUT(burnUT);
return deltaV;
}
示例2: TimeToPhaseAngle
//Computes the time until the phase angle between the launchpad and the target equals the given angle.
//The convention used is that phase angle is the angle measured starting at the target and going east until
//you get to the launchpad.
//The time returned will not be exactly accurate unless the target is in an exactly circular orbit. However,
//the time returned will go to exactly zero when the desired phase angle is reached.
public static double TimeToPhaseAngle(double phaseAngle, CelestialBody launchBody, double launchLongitude, Orbit target)
{
double launchpadAngularRate = 360 / launchBody.rotationPeriod;
double targetAngularRate = 360.0 / target.period;
if (Vector3d.Dot(target.SwappedOrbitNormal(), launchBody.angularVelocity) < 0) targetAngularRate *= -1; //retrograde target
Vector3d currentLaunchpadDirection = launchBody.GetSurfaceNVector(0, launchLongitude);
Vector3d currentTargetDirection = target.SwappedRelativePositionAtUT(Planetarium.GetUniversalTime());
currentTargetDirection = Vector3d.Exclude(launchBody.angularVelocity, currentTargetDirection);
double currentPhaseAngle = Math.Abs(Vector3d.Angle(currentLaunchpadDirection, currentTargetDirection));
if (Vector3d.Dot(Vector3d.Cross(currentTargetDirection, currentLaunchpadDirection), launchBody.angularVelocity) < 0)
{
currentPhaseAngle = 360 - currentPhaseAngle;
}
double phaseAngleRate = launchpadAngularRate - targetAngularRate;
double phaseAngleDifference = MuUtils.ClampDegrees360(phaseAngle - currentPhaseAngle);
if (phaseAngleRate < 0)
{
phaseAngleRate *= -1;
phaseAngleDifference = 360 - phaseAngleDifference;
}
return phaseAngleDifference / phaseAngleRate;
}
示例3: DeltaVAndTimeForHohmannTransfer
//Computes the time and dV of a Hohmann transfer injection burn such that at apoapsis the transfer
//orbit passes as close as possible to the target.
//The output burnUT will be the first transfer window found after the given UT.
//Assumes o and target are in approximately the same plane, and orbiting in the same direction.
//Also assumes that o is a perfectly circular orbit (though result should be OK for small eccentricity).
public static Vector3d DeltaVAndTimeForHohmannTransfer(Orbit o, Orbit target, double UT, out double burnUT)
{
double synodicPeriod = o.SynodicPeriod(target);
Vector3d burnDV = Vector3d.zero;
burnUT = UT;
double bestApproachDistance = Double.MaxValue;
double minTime = UT;
double maxTime = UT + 1.1 * synodicPeriod;
int numDivisions = 20;
for (int iter = 0; iter < 8; iter++)
{
double dt = (maxTime - minTime) / numDivisions;
for (int i = 0; i < numDivisions; i++)
{
double t = minTime + i * dt;
Vector3d apsisDirection = -o.SwappedRelativePositionAtUT(t);
double desiredApsis = target.RadiusAtTrueAnomaly(target.TrueAnomalyFromVector(apsisDirection));
double approachDistance;
Vector3d burn;
if (desiredApsis > o.ApR)
{
burn = DeltaVToChangeApoapsis(o, t, desiredApsis);
Orbit transferOrbit = o.PerturbedOrbit(t, burn);
approachDistance = transferOrbit.Separation(target, transferOrbit.NextApoapsisTime(t));
}
else
{
burn = DeltaVToChangePeriapsis(o, t, desiredApsis);
Orbit transferOrbit = o.PerturbedOrbit(t, burn);
approachDistance = transferOrbit.Separation(target, transferOrbit.NextPeriapsisTime(t));
}
if (approachDistance < bestApproachDistance)
{
bestApproachDistance = approachDistance;
burnUT = t;
burnDV = burn;
}
}
minTime = MuUtils.Clamp(burnUT - dt, UT, UT + synodicPeriod);
maxTime = MuUtils.Clamp(burnUT + dt, UT, UT + synodicPeriod);
}
return burnDV;
}
示例4: DeltaVToInterceptAtTime
//Computes the delta-V of a burn at a given time that will put an object with a given orbit on a
//course to intercept a target at a specific interceptUT.
public static Vector3d DeltaVToInterceptAtTime(Orbit o, double UT, Orbit target, double interceptUT, double offsetDistance = 0)
{
double initialT = UT;
Vector3d initialRelPos = o.SwappedRelativePositionAtUT(initialT);
double finalT = interceptUT;
Vector3d finalRelPos = target.SwappedRelativePositionAtUT(finalT);
double targetOrbitalSpeed = o.SwappedOrbitalVelocityAtUT(finalT).magnitude;
double deltaTPrecision = 20.0 / targetOrbitalSpeed;
Vector3d initialVelocity, finalVelocity;
LambertSolver.Solve(initialRelPos, finalRelPos, finalT - initialT, o.referenceBody, true, out initialVelocity, out finalVelocity);
if (offsetDistance != 0)
{
finalRelPos += offsetDistance * Vector3d.Cross(finalVelocity, finalRelPos).normalized;
LambertSolver.Solve(initialRelPos, finalRelPos, finalT - initialT, o.referenceBody, true, out initialVelocity, out finalVelocity);
}
Vector3d currentInitialVelocity = o.SwappedOrbitalVelocityAtUT(initialT);
return initialVelocity - currentInitialVelocity;
}
示例5: FreefallEnded
//Freefall orbit ends when either
// - we enter the atmosphere, or
// - our vertical velocity is negative and either
// - we've landed or
// - the descent speed policy says to start braking
bool FreefallEnded(Orbit initialOrbit, double UT)
{
Vector3d pos = initialOrbit.SwappedRelativePositionAtUT(UT);
Vector3d surfaceVelocity = SurfaceVelocity(pos, initialOrbit.SwappedOrbitalVelocityAtUT(UT));
if (pos.magnitude < aerobrakedRadius) return true;
if (Vector3d.Dot(surfaceVelocity, initialOrbit.Up(UT)) > 0) return false;
if (pos.magnitude < landedRadius) return true;
if (descentSpeedPolicy != null && surfaceVelocity.magnitude > descentSpeedPolicy.MaxAllowedSpeed(pos, surfaceVelocity)) return true;
return false;
}
示例6: AdvanceToFreefallEnd
void AdvanceToFreefallEnd(Orbit initialOrbit)
{
t = FindFreefallEndTime(initialOrbit);
x = initialOrbit.SwappedRelativePositionAtUT(t);
v = initialOrbit.SwappedOrbitalVelocityAtUT(t);
if (double.IsNaN(v.magnitude))
{
//For eccentricities close to 1, the Orbit class functions are unreliable and
//v may come out as NaN. If that happens we estimate v from conservation
//of energy and the assumption that v is vertical (since ecc. is approximately 1).
//0.5 * v^2 - GM / r = E => v = sqrt(2 * (E + GM / r))
double GM = initialOrbit.referenceBody.gravParameter;
double E = -GM / (2 * initialOrbit.semiMajorAxis);
v = Math.Sqrt(Math.Abs(2 * (E + GM / x.magnitude))) * x.normalized;
if (initialOrbit.MeanAnomalyAtUT(t) > Math.PI) v *= -1;
}
}
示例7: DrawNextPe
private void DrawNextPe(Orbit o, CelestialBody referenceBody, double referenceTime, Color iconColor, Matrix4x4 screenTransform)
{
/*
switch (o.patchEndTransition)
{
case Orbit.PatchTransitionType.ENCOUNTER:
Debug.Log("ENCOUNTER patch end type");
break;
case Orbit.PatchTransitionType.ESCAPE:
Debug.Log("ESCAPE patch end type");
break;
// FINAL is applied to the active vessel in a stable elliptical
// orbit.
case Orbit.PatchTransitionType.FINAL:
Debug.Log("FINAL patch end type");
break;
// INITIAL patchEndTransition appears to be applied to inactive
// vessels (targeted vessels).
case Orbit.PatchTransitionType.INITIAL:
Debug.Log("INITIAL patch end type");
break;
case Orbit.PatchTransitionType.MANEUVER:
Debug.Log("MANEUVER patch end type");
break;
}
*/
double nextPeTime = o.NextPeriapsisTime(referenceTime);
if (nextPeTime < o.EndUT || (o.patchEndTransition == Orbit.PatchTransitionType.FINAL)) {
Vector3d relativePosition = o.SwappedRelativePositionAtUT(nextPeTime) + o.referenceBody.getTruePositionAtUT(nextPeTime) - referenceBody.getTruePositionAtUT(nextPeTime);
var transformedPosition = screenTransform.MultiplyPoint3x4(relativePosition);
DrawIcon(transformedPosition.x, transformedPosition.y, VesselType.Unknown, iconColor, MapIcons.OtherIcon.PE);
}
}
示例8: DrawNextAp
private void DrawNextAp(Orbit o, CelestialBody referenceBody, double referenceTime, Color iconColor, Matrix4x4 screenTransform)
{
if (o.eccentricity >= 1.0) {
// Early return: There is no apoapsis on a hyperbolic orbit
return;
}
double nextApTime = o.NextApoapsisTime(referenceTime);
if (nextApTime < o.EndUT || (o.patchEndTransition == Orbit.PatchTransitionType.FINAL)) {
Vector3d relativePosition = o.SwappedRelativePositionAtUT(nextApTime) + o.referenceBody.getTruePositionAtUT(nextApTime) - referenceBody.getTruePositionAtUT(nextApTime);
var transformedPosition = screenTransform.MultiplyPoint3x4(relativePosition);
DrawIcon(transformedPosition.x, transformedPosition.y, VesselType.Unknown, iconColor, MapIcons.OtherIcon.AP);
}
}
示例9: PhaseAngle
//Computes the phase angle between two orbiting objects.
//This only makes sence if a.referenceBody == b.referenceBody.
public static double PhaseAngle(this Orbit a, Orbit b, double UT)
{
Vector3d normalA = a.SwappedOrbitNormal();
Vector3d posA = a.SwappedRelativePositionAtUT(UT);
Vector3d projectedB = Vector3d.Exclude(normalA, b.SwappedRelativePositionAtUT(UT));
double angle = Vector3d.Angle(posA, projectedB);
if (Vector3d.Dot(Vector3d.Cross(normalA, posA), projectedB) < 0)
{
angle = 360 - angle;
}
return angle;
}
示例10: DeltaVAndTimeForCheapestCourseCorrection
public static Vector3d DeltaVAndTimeForCheapestCourseCorrection(Orbit o, double UT, Orbit target, double caDistance, out double burnUT)
{
Vector3d collisionDV = DeltaVAndTimeForCheapestCourseCorrection(o, UT, target, out burnUT);
Orbit collisionOrbit = o.PerturbedOrbit(burnUT, collisionDV);
double collisionUT = collisionOrbit.NextClosestApproachTime(target, burnUT);
Vector3d position = o.SwappedAbsolutePositionAtUT(collisionUT);
Vector3d targetPos = target.SwappedAbsolutePositionAtUT(collisionUT);
Vector3d direction = targetPos - position;
Vector3d interceptTarget = targetPos + target.NormalPlus(collisionUT) * caDistance;
Vector3d velAfterBurn;
Vector3d arrivalVel;
LambertSolver.Solve(o.SwappedRelativePositionAtUT(burnUT), interceptTarget - o.referenceBody.position, collisionUT - burnUT, o.referenceBody, true, out velAfterBurn, out arrivalVel);
Vector3d deltaV = velAfterBurn - o.SwappedOrbitalVelocityAtUT(burnUT);
return deltaV;
}
示例11: DeltaVAndApsisPhaseAngleOfHohmannTransfer
//Computes the dV of a Hohmann transfer burn at time UT that will put the apoapsis or periapsis
//of the transfer orbit on top of the target orbit.
//The output value apsisPhaseAngle is the phase angle between the transferring vessel and the
//target object as the transferring vessel crosses the target orbit at the apoapsis or periapsis
//of the transfer orbit.
//Actually, it's not exactly the phase angle. It's a sort of mean anomaly phase angle. The
//difference is not important for how this function is used by DeltaVAndTimeForHohmannTransfer.
private static Vector3d DeltaVAndApsisPhaseAngleOfHohmannTransfer(Orbit o, Orbit target, double UT, out double apsisPhaseAngle)
{
Vector3d apsisDirection = -o.SwappedRelativePositionAtUT(UT);
double desiredApsis = target.RadiusAtTrueAnomaly(MathExtensions.Deg2Rad * target.TrueAnomalyFromVector(apsisDirection));
Vector3d dV;
if (desiredApsis > o.ApR)
{
dV = DeltaVToChangeApoapsis(o, UT, desiredApsis);
Orbit transferOrbit = o.PerturbedOrbit(UT, dV);
double transferApTime = transferOrbit.NextApoapsisTime(UT);
Vector3d transferApDirection = transferOrbit.SwappedRelativePositionAtApoapsis(); // getRelativePositionAtUT was returning NaNs! :(((((
double targetTrueAnomaly = target.TrueAnomalyFromVector(transferApDirection);
double meanAnomalyOffset = 360 * (target.TimeOfTrueAnomaly(targetTrueAnomaly, UT) - transferApTime) / target.period;
apsisPhaseAngle = meanAnomalyOffset;
}
else
{
dV = DeltaVToChangePeriapsis(o, UT, desiredApsis);
Orbit transferOrbit = o.PerturbedOrbit(UT, dV);
double transferPeTime = transferOrbit.NextPeriapsisTime(UT);
Vector3d transferPeDirection = transferOrbit.SwappedRelativePositionAtPeriapsis(); // getRelativePositionAtUT was returning NaNs! :(((((
double targetTrueAnomaly = target.TrueAnomalyFromVector(transferPeDirection);
double meanAnomalyOffset = 360 * (target.TimeOfTrueAnomaly(targetTrueAnomaly, UT) - transferPeTime) / target.period;
apsisPhaseAngle = meanAnomalyOffset;
}
apsisPhaseAngle = MuUtils.ClampDegrees180(apsisPhaseAngle);
return dV;
}