Orbital elements: Difference between revisions

Content added Content deleted
m (→‎{{header|Perl 6}}: added zkl header)
(→‎{{header|zkl}}: added code)
Line 137: Line 137:
=={{header|zkl}}==
=={{header|zkl}}==
{{trans|Perl}}
{{trans|Perl}}
<lang zkl>fcn orbital_state_vectors(semimajor_axis, eccentricity, inclination,
longitude_of_ascending_node, argument_of_periapsis, true_anomaly){
i,j,k:=T(1.0, 0.0, 0.0), T(0.0, 1.0, 0.0), T(0.0, 0.0, 1.0);
vdot:=fcn(c,vector){ vector.apply('*,c) };
vsum:=fcn(v1,v2) { v1.zipWith('+,v2) };
rotate:='wrap(alpha, a,b){ // a&b are vectors: (x,y,z)
return(vsum(vdot( alpha.cos(),a), vdot(alpha.sin(),b)), #cos(alpha)*a + sin(alpha)*b
vsum(vdot(-alpha.sin(),a), vdot(alpha.cos(),b)));
};
i,j=rotate(longitude_of_ascending_node,i,j);
j,k=rotate(inclination, j,k);
i,j=rotate(argument_of_periapsis, i,j);
l:=if(eccentricity==1) # PARABOLIC CASE
semimajor_axis*2 else
semimajor_axis*(1.0 - eccentricity.pow(2));;
c,s,r:=true_anomaly.cos(), true_anomaly.sin(), l/(eccentricity*c + 1);
rprime:=s*r.pow(2)/l;
position:=vdot(r,vsum(vdot(c,i), vdot(s,j))); #r*(c*i + s*j)
speed:=vsum(vdot(rprime*c - r*s,i), vdot(rprime*s + r*c,j)); #(rprime*c - r*s)*i + (rprime*s + r*c)*j
z:=speed.zipWith('*,speed).sum(0.0).sqrt(); #sqrt(speed**2)
speed=vdot(1.0/z,speed); #speed/z

speed=vdot((2.0/r - 1.0/semimajor_axis).sqrt(),speed); #speed*sqrt(2/r - 1/semimajor_axis)
return(position,speed);
}</lang>
<lang zkl>orbital_state_vectors(
1.0, # semimajor axis
0.1, # eccentricity
0.0, # inclination
(0.0).pi/6, # longitude of ascending node
0.0, # argument of periapsis
0.0 # true-anomaly
).println();</lang>
{{out}}
<pre>
L(L(0.779423,0.45,0),L(-0.552771,0.957427,0))
</pre>