本文整理汇总了C#中Orbit.getTruePositionAtUT方法的典型用法代码示例。如果您正苦于以下问题:C# Orbit.getTruePositionAtUT方法的具体用法?C# Orbit.getTruePositionAtUT怎么用?C# Orbit.getTruePositionAtUT使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Orbit
的用法示例。
在下文中一共展示了Orbit.getTruePositionAtUT方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: OptimizeEjection
public static ManeuverParameters OptimizeEjection(ManeuverParameters original_maneuver, Orbit initial_orbit, Orbit target, double UT_arrival, double earliest_UT)
{
while(true)
{
alglib.minlmstate state;
alglib.minlmreport rep;
double[] x = new double[4];
double[] scale = new double[4];
x[0] = original_maneuver.dV.x;
x[1] = original_maneuver.dV.y;
x[2] = original_maneuver.dV.z;
x[3] = 0;
scale[0] = scale[1] = scale[2] = original_maneuver.dV.magnitude;
scale[3] = initial_orbit.period;
OptimizerData data = new OptimizerData();
data.initial_orbit = initial_orbit;
data.original_UT = original_maneuver.UT;
data.UT_arrival = UT_arrival;
data.pos_arrival = target.getTruePositionAtUT(UT_arrival);
alglib.minlmcreatev(4, x, 0.01, out state);
double epsx = 1e-4; // stop if |(x(k+1)-x(k)) ./ scale| <= EpsX
double epsf = 0.01; // stop if |F(k+1)-F(k)| <= EpsF*max{|F(k)|,|F(k+1)|,1}
alglib.minlmsetcond(state, 0, epsf, epsx, 50);
alglib.minlmsetscale(state, scale);
alglib.minlmoptimize(state, DistanceToTarget, null, data);
alglib.minlmresults(state, out x, out rep);
Debug.Log("Transfer calculator: termination type=" + rep.terminationtype);
Debug.Log("Transfer calculator: iteration count=" + rep.iterationscount);
// try again in one orbit if the maneuver node is in the past
if (original_maneuver.UT + x[3] < earliest_UT)
{
Debug.Log("Transfer calculator: maneuver is " + (earliest_UT - original_maneuver.UT - x[3]) + " s too early, trying again in " + initial_orbit.period + " s");
original_maneuver.UT += initial_orbit.period;
}
else
return new ManeuverParameters(new Vector3d(x[0], x[1], x[2]), original_maneuver.UT + x[3]);
}
}
示例2: UpdateFromOrbitAtUT
public void UpdateFromOrbitAtUT(Orbit orbit, double UT, CelestialBody toBody)
{
pos = (orbit.getTruePositionAtUT(UT) - toBody.getTruePositionAtUT(UT)).xzy;
vel = orbit.getOrbitalVelocityAtUT(UT) + orbit.referenceBody.GetFrameVelAtUT(UT) - toBody.GetFrameVelAtUT(UT);
UpdateFromStateVectors(pos, vel, toBody, UT);
}
示例3: DistanceToTarget
static void DistanceToTarget(double[] x, double[] fi, object obj)
{
OptimizerData data = (OptimizerData)obj;
double t = data.original_UT + x[3];
Vector3d DV = new Vector3d(x[0], x[1], x[2]);
Orbit orbit = new Orbit();
orbit.UpdateFromStateVectors(data.initial_orbit.getRelativePositionAtUT(t), data.initial_orbit.getOrbitalVelocityAtUT(t) + DV.xzy, data.initial_orbit.referenceBody, t);
orbit.StartUT = t;
var pars = new PatchedConics.SolverParameters();
Vector3d pos;
while(true)
{
Orbit next_orbit = new Orbit();
PatchedConics.CalculatePatch(orbit, next_orbit, orbit.StartUT, pars, null);
if (orbit.EndUT > data.UT_arrival)
{
pos = orbit.getTruePositionAtUT(data.UT_arrival);
Vector3d err = pos - data.pos_arrival;
fi[0] = err.x;
fi[1] = err.y;
fi[2] = err.z;
return;
}
// As of 0.25 CalculatePatch fails if the orbit does not change SoI
if (next_orbit.referenceBody == null)
{
next_orbit.UpdateFromOrbitAtUT(orbit, orbit.StartUT + orbit.period, orbit.referenceBody);
}
orbit = next_orbit;
}
}