本文整理汇总了C#中Orbit.Radius方法的典型用法代码示例。如果您正苦于以下问题:C# Orbit.Radius方法的具体用法?C# Orbit.Radius怎么用?C# Orbit.Radius使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Orbit
的用法示例。
在下文中一共展示了Orbit.Radius方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: MakeNodeImpl
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("new apoapsis cannot be lower than the altitude of the burn (" + burnAltitude + ")");
}
return new ManeuverParameters(OrbitalManeuverCalculator.DeltaVToChangeApoapsis(o, UT, newApA + o.referenceBody.Radius), UT);
}
示例2: MakeNodeImpl
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 = "Warning: new Semi-Major Axis is very large, and may result in a hyberbolic orbit";
}
if(o.Radius(UT) > 2*newSMA)
{
throw new OperationException("cannot make Semi-Major Axis less than twice the burn altitude plus the radius of " + o.referenceBody.theName + "(" + MuUtils.ToSI(o.referenceBody.Radius, 3) + "m)");
}
return new ManeuverParameters(OrbitalManeuverCalculator.DeltaVForSemiMajorAxis (o, UT, newSMA), UT);
}
示例3: MakeNodeImpl
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("new periapsis cannot be higher than the altitude of the burn (" + burnAltitude + ")");
}
else if (o.referenceBody.Radius + newApA < o.Radius(UT))
{
throw new OperationException("new apoapsis cannot be lower than the altitude of the burn (" + burnAltitude + ")");
}
else if (newPeA < -o.referenceBody.Radius)
{
throw new OperationException("new periapsis cannot be lower than minus the radius of " + o.referenceBody.theName + "(-" + MuUtils.ToSI(o.referenceBody.Radius, 3) + "m)");
}
return new ManeuverParameters(OrbitalManeuverCalculator.DeltaVToEllipticize(o, UT, newPeA + o.referenceBody.Radius, newApA + o.referenceBody.Radius), UT);
}
示例4: DeltaVToChangePeriapsis
//Computes the delta-V of the burn required to attain a given periapsis, starting from
//a given orbit and burning at a given UT. Throws an ArgumentException if given an impossible periapsis.
//The computed burn is always horizontal, though this may not be strictly optimal.
public static Vector3d DeltaVToChangePeriapsis(Orbit o, double UT, double newPeR)
{
double radius = o.Radius(UT);
//sanitize input
newPeR = MuUtils.Clamp(newPeR, 0 + 1, radius - 1);
//are we raising or lowering the periapsis?
bool raising = (newPeR > o.PeR);
Vector3d burnDirection = (raising ? 1 : -1) * o.Horizontal(UT);
double minDeltaV = 0;
double maxDeltaV;
if (raising)
{
//put an upper bound on the required deltaV:
maxDeltaV = 0.25;
while (o.PerturbedOrbit(UT, maxDeltaV * burnDirection).PeR < newPeR)
{
maxDeltaV *= 2;
if (maxDeltaV > 100000) break; //a safety precaution
}
}
else
{
//when lowering periapsis, we burn horizontally, and max possible deltaV is the deltaV required to kill all horizontal velocity
maxDeltaV = Math.Abs(Vector3d.Dot(o.SwappedOrbitalVelocityAtUT(UT), burnDirection));
}
//now do a binary search to find the needed delta-v
while (maxDeltaV - minDeltaV > 0.01)
{
double testDeltaV = (maxDeltaV + minDeltaV) / 2.0;
double testPeriapsis = o.PerturbedOrbit(UT, testDeltaV * burnDirection).PeR;
if ((testPeriapsis > newPeR && raising) || (testPeriapsis < newPeR && !raising))
{
maxDeltaV = testDeltaV;
}
else
{
minDeltaV = testDeltaV;
}
}
return ((maxDeltaV + minDeltaV) / 2) * burnDirection;
}
示例5: DeltaVToEllipticize
//Computes the deltaV of the burn needed to set a given PeR and ApR at at a given UT.
public static Vector3d DeltaVToEllipticize(Orbit o, double UT, double newPeR, double newApR)
{
double radius = o.Radius(UT);
//sanitize inputs
newPeR = MuUtils.Clamp(newPeR, 0 + 1, radius - 1);
newApR = Math.Max(newApR, radius + 1);
double GM = o.referenceBody.gravParameter;
double E = -GM / (newPeR + newApR); //total energy per unit mass of new orbit
double L = Math.Sqrt(Math.Abs((Math.Pow(E * (newApR - newPeR), 2) - GM * GM) / (2 * E))); //angular momentum per unit mass of new orbit
double kineticE = E + GM / radius; //kinetic energy (per unit mass) of new orbit at UT
double horizontalV = L / radius; //horizontal velocity of new orbit at UT
double verticalV = Math.Sqrt(Math.Abs(2 * kineticE - horizontalV * horizontalV)); //vertical velocity of new orbit at UT
Vector3d actualVelocity = o.SwappedOrbitalVelocityAtUT(UT);
//untested:
verticalV *= Math.Sign(Vector3d.Dot(o.Up(UT), actualVelocity));
Vector3d desiredVelocity = horizontalV * o.Horizontal(UT) + verticalV * o.Up(UT);
return desiredVelocity - actualVelocity;
}
示例6: DeltaVToCircularize
//Computes the deltaV of the burn needed to circularize an orbit at a given UT.
public static Vector3d DeltaVToCircularize(Orbit o, double UT)
{
Vector3d desiredVelocity = CircularOrbitSpeed(o.referenceBody, o.Radius(UT)) * o.Horizontal(UT);
Vector3d actualVelocity = o.SwappedOrbitalVelocityAtUT(UT);
return desiredVelocity - actualVelocity;
}
示例7: DeltaVToChangeApoapsis
//Computes the delta-V of the burn at a given UT required to change an orbits apoapsis to a given value.
//The computed burn is always prograde or retrograde, though this may not be strictly optimal.
//Note that you can pass in a negative apoapsis if the desired final orbit is hyperbolic
public static Vector3d DeltaVToChangeApoapsis(Orbit o, double UT, double newApR)
{
double radius = o.Radius(UT);
//sanitize input
if (newApR > 0) newApR = Math.Max(newApR, radius + 1);
//are we raising or lowering the periapsis?
bool raising = ApoapsisIsHigher(newApR, o.ApR);
Vector3d burnDirection = (raising ? 1 : -1) * o.Prograde(UT);
double minDeltaV = 0;
double maxDeltaV;
if (raising)
{
//put an upper bound on the required deltaV:
maxDeltaV = 0.25;
double ap = o.ApR;
while (ApoapsisIsHigher(newApR, ap))
{
maxDeltaV *= 2;
ap = o.PerturbedOrbit(UT, maxDeltaV * burnDirection).ApR;
if (maxDeltaV > 100000) break; //a safety precaution
}
}
else
{
//when lowering apoapsis, we burn retrograde, and max possible deltaV is total velocity
maxDeltaV = o.SwappedOrbitalVelocityAtUT(UT).magnitude;
}
//now do a binary search to find the needed delta-v
while (maxDeltaV - minDeltaV > 0.01)
{
double testDeltaV = (maxDeltaV + minDeltaV) / 2.0;
double testApoapsis = o.PerturbedOrbit(UT, testDeltaV * burnDirection).ApR;
bool above = ApoapsisIsHigher(testApoapsis, newApR);
if ((raising && above) || (!raising && !above))
{
maxDeltaV = testDeltaV;
}
else
{
minDeltaV = testDeltaV;
}
}
return ((maxDeltaV + minDeltaV) / 2) * burnDirection;
}
示例8: DeltaVToShiftNodeLongitude
public static Vector3d DeltaVToShiftNodeLongitude(Orbit o, double UT, double newNodeLong)
{
// Get the location underneath the burn location at the current moment.
// Note that this does NOT account for the rotation of the body that will happen between now
// and when the vessel reaches the apoapsis.
Vector3d pos = o.SwappedAbsolutePositionAtUT (UT);
double burnRadius = o.Radius (UT);
double oppositeRadius = 0;
// Back out the rotation of the body to calculate the longitude of the apoapsis when the vessel reaches the node
double degreeRotationToNode = (UT - Planetarium.GetUniversalTime ()) * 360 / o.referenceBody.rotationPeriod;
double NodeLongitude = o.referenceBody.GetLongitude(pos) - degreeRotationToNode;
double LongitudeOffset = NodeLongitude - newNodeLong; // Amount we need to shift the Ap's longitude
// Calculate a semi-major axis that gives us an orbital period that will rotate the body to place
// the burn location directly over the newNodeLong longitude, over the course of one full orbit.
// N tracks the number of full body rotations desired in a vessal orbit.
// If N=0, we calculate the SMA required to let the body rotate less than a full local day.
// If the resulting SMA would drop us under the 5x time warp limit, we deem it to be too low, and try again with N+1.
// In other words, we allow the body to rotate more than 1 day, but less then 2 days.
// As long as the resulting SMA is below the 5x limit, we keep increasing N until we find a viable solution.
// This may place the apside out the sphere of influence, however.
// TODO: find the cheapest SMA, instead of the smallest
int N = -1;
double target_sma = 0;
while (oppositeRadius-o.referenceBody.Radius < o.referenceBody.timeWarpAltitudeLimits [4] && N < 20) {
N++;
double target_period = o.referenceBody.rotationPeriod * (LongitudeOffset / 360 + N);
target_sma = Math.Pow ((o.referenceBody.gravParameter * target_period * target_period) / (4 * Math.PI * Math.PI), 1.0 / 3.0); // cube roo
oppositeRadius = 2 * (target_sma) - burnRadius;
}
return DeltaVForSemiMajorAxis (o, UT, target_sma);
}
示例9: GetPositionAtT
private static bool GetPositionAtT(Vessel thatVessel, Orbit thatOrbit, double initial, double timePoint, out Vector2d coordinates, out bool collision)
{
coordinates = Vector2d.zero;
collision = false;
if (double.IsNaN(thatOrbit.getObtAtUT(initial + timePoint)))
return false;
double rotOffset = 0;
if (thatVessel.mainBody.rotates) {
rotOffset = (360 * ((timePoint - initial) / thatVessel.mainBody.rotationPeriod)) % 360;
}
Vector3d pos = thatOrbit.getPositionAtUT(timePoint);
if (thatOrbit.Radius(timePoint) < thatVessel.mainBody.Radius + thatVessel.mainBody.getElevation(pos)) {
collision = true;
return false;
}
coordinates = new Vector2d(thatVessel.mainBody.GetLongitude(pos) - rotOffset, thatVessel.mainBody.GetLatitude(pos));
return true;
}
示例10: CheckPreconditions
bool CheckPreconditions(Orbit o, double UT)
{
errorMessage = "";
bool error = false;
string burnAltitude = MuUtils.ToSI(o.Radius(UT) - o.referenceBody.Radius) + "m";
switch (operation)
{
case Operation.CIRCULARIZE:
break;
case Operation.ELLIPTICIZE:
if (o.referenceBody.Radius + newPeA > o.Radius(UT))
{
error = true;
errorMessage = "new periapsis cannot be higher than the altitude of the burn (" + burnAltitude + ")";
}
else if (o.referenceBody.Radius + newApA < o.Radius(UT))
{
error = true;
errorMessage = "new apoapsis cannot be lower than the altitude of the burn (" + burnAltitude + ")";
}
else if (newPeA < -o.referenceBody.Radius)
{
error = true;
errorMessage = "new periapsis cannot be lower than minus the radius of " + o.referenceBody.theName + "(-" + MuUtils.ToSI(o.referenceBody.Radius, 3) + "m)";
}
break;
case Operation.PERIAPSIS:
if (o.referenceBody.Radius + newPeA > o.Radius(UT))
{
error = true;
errorMessage = "new periapsis cannot be higher than the altitude of the burn (" + burnAltitude + ")";
}
else if (newPeA < -o.referenceBody.Radius)
{
error = true;
errorMessage = "new periapsis cannot be lower than minus the radius of " + o.referenceBody.theName + "(-" + MuUtils.ToSI(o.referenceBody.Radius, 3) + "m)";
}
break;
case Operation.APOAPSIS:
if (o.referenceBody.Radius + newApA < o.Radius(UT))
{
error = true;
errorMessage = "new apoapsis cannot be lower than the altitude of the burn (" + burnAltitude + ")";
}
break;
case Operation.INCLINATION:
break;
case Operation.PLANE:
if (!core.target.NormalTargetExists)
{
error = true;
errorMessage = "must select a target to match planes with.";
}
else if (o.referenceBody != core.target.Orbit.referenceBody)
{
error = true;
errorMessage = "can only match planes with an object in the same sphere of influence.";
}
else if (timeReference == TimeReference.REL_ASCENDING)
{
if (!o.AscendingNodeExists(core.target.Orbit))
{
error = true;
errorMessage = "ascending node with target doesn't exist.";
}
}
else
{
if (!o.DescendingNodeExists(core.target.Orbit))
{
error = true;
errorMessage = "descending node with target doesn't exist.";
}
}
break;
case Operation.TRANSFER:
if (!core.target.NormalTargetExists)
{
error = true;
errorMessage = "must select a target for the Hohmann transfer.";
}
else if (o.referenceBody != core.target.Orbit.referenceBody)
{
error = true;
errorMessage = "target for Hohmann transfer must be in the same sphere of influence.";
}
else if (o.eccentricity > 1)
{
error = true;
errorMessage = "starting orbit for Hohmann transfer must not be hyperbolic.";
}
else if (core.target.Orbit.eccentricity > 1)
//.........这里部分代码省略.........