Orbital elements: Difference between revisions
Content added Content deleted
(link to Wikipedia article about polar coordinates) |
(Added XPL0 example.) |
||
Line 2,036: | Line 2,036: | ||
Position : (0.77942284339868, 0.45000003465368, 0) |
Position : (0.77942284339868, 0.45000003465368, 0) |
||
Speed : (-0.55277084096044, 0.95742708317976, 0) |
Speed : (-0.55277084096044, 0.95742708317976, 0) |
||
</pre> |
|||
=={{header|XPL0}}== |
|||
{{trans|C}} |
|||
<syntaxhighlight lang "XPL0">include xpllib; \for VCopy, VAdd, VMul, VDiv, VMag and Print |
|||
proc VShow(A); |
|||
real A; |
|||
Print("(%1.6f, %1.6f, %1.6f)\n", A(0), A(1), A(2)); |
|||
func real VMulAdd(V0, V1, V2, X1, X2); |
|||
real V0, V1, V2, X1, X2, V3(3), V4(3); |
|||
return VAdd(V0, VMul(V3, V1, X1), VMul(V4, V2, X2)); |
|||
proc Rotate(I, J, Alpha, PS); |
|||
real I, J, Alpha, PS; |
|||
[VMulAdd(PS(0), I, J, Cos(Alpha), Sin(Alpha)); |
|||
VMulAdd(PS(1), I, J, -Sin(Alpha), Cos(Alpha)); |
|||
]; |
|||
proc OrbitalStateVectors; real SemiMajorAxis, Eccentricity, Inclination, |
|||
LongitudeOfAscendingNode, ArgumentOfPeriapsis, TrueAnomaly, PS; |
|||
real I, J, K, L, QS(2,3), C, S, R, RPrime; |
|||
[I:= [1.0, 0.0, 0.0]; |
|||
J:= [0.0, 1.0, 0.0]; |
|||
K:= [0.0, 0.0, 1.0]; |
|||
L:= 2.0; |
|||
Rotate(I, J, LongitudeOfAscendingNode, QS); |
|||
VCopy(I, QS(0)); VCopy(J, QS(1)); |
|||
Rotate(J, K, Inclination, QS); |
|||
VCopy(J, QS(0)); |
|||
Rotate(I, J, ArgumentOfPeriapsis, QS); |
|||
VCopy(I, QS(0)); VCopy(J, QS(1)); |
|||
if Eccentricity # 1.0 then L:= 1.0 - Eccentricity*Eccentricity; |
|||
L:= L * SemiMajorAxis; |
|||
C:= Cos(TrueAnomaly); |
|||
S:= Sin(TrueAnomaly); |
|||
R:= L / (1.0 + Eccentricity*C); |
|||
RPrime:= S * R * R / L; |
|||
VMulAdd(PS(0), I, J, C, S); |
|||
VMul(PS(0), PS(0), R); |
|||
VMulAdd(PS(1), I, J, RPrime*C - R*S, RPrime*S + R*C); |
|||
VDiv(PS(1), PS(1), VMag(PS(1))); |
|||
VMul(PS(1), PS(1), sqrt(2.0/R - 1.0/SemiMajorAxis)); |
|||
]; |
|||
def Longitude = 355.0 / (113.0 * 6.0); |
|||
real PS(2,3); |
|||
[OrbitalStateVectors(1.0, 0.1, 0.0, Longitude, 0.0, 0.0, PS); |
|||
Print("Position : "); VShow(PS(0)); |
|||
Print("Speed : "); VShow(PS(1)); |
|||
]</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
Position : (0.779423, 0.450000, 0.000000) |
|||
Speed : (-0.552771, 0.957427, 0.000000) |
|||
</pre> |
</pre> |
||