Orbital elements: Difference between revisions
Content added Content deleted
m (→{{header|Java}}: Fixed 'long lines' problem.) |
(Added C) |
||
Line 31: | Line 31: | ||
TODO: pick an example from a reputable source, and bring the algorithm description onto this site. (Restating those pages in concise a fashion comprehensible to the coders and readers of this site will be a good exercise.) |
TODO: pick an example from a reputable source, and bring the algorithm description onto this site. (Restating those pages in concise a fashion comprehensible to the coders and readers of this site will be a good exercise.) |
||
<br><br> |
<br><br> |
||
=={{header|C}}== |
|||
{{trans|Kotlin}} |
|||
<lang c>#include <stdio.h> |
|||
#include <math.h> |
|||
typedef struct { |
|||
double x, y, z; |
|||
} vector; |
|||
vector add(vector v, vector w) { |
|||
return (vector){v.x + w.x, v.y + w.y, v.z + w.z}; |
|||
} |
|||
vector mul(vector v, double m) { |
|||
return (vector){v.x * m, v.y * m, v.z * m}; |
|||
} |
|||
vector div(vector v, double d) { |
|||
return mul(v, 1.0 / d); |
|||
} |
|||
double vabs(vector v) { |
|||
return sqrt(v.x * v.x + v.y * v.y + v.z * v.z); |
|||
} |
|||
vector mulAdd(vector v1, vector v2, double x1, double x2) { |
|||
return add(mul(v1, x1), mul(v2, x2)); |
|||
} |
|||
void vecAsStr(char buffer[], vector v) { |
|||
sprintf(buffer, "(%.17g, %.17g, %.17g)", v.x, v.y, v.z); |
|||
} |
|||
void rotate(vector i, vector j, double alpha, vector ps[]) { |
|||
ps[0] = mulAdd(i, j, cos(alpha), sin(alpha)); |
|||
ps[1] = mulAdd(i, j, -sin(alpha), cos(alpha)); |
|||
} |
|||
void orbitalStateVectors( |
|||
double semimajorAxis, double eccentricity, double inclination, |
|||
double longitudeOfAscendingNode, double argumentOfPeriapsis, |
|||
double trueAnomaly, vector ps[]) { |
|||
vector i = {1.0, 0.0, 0.0}; |
|||
vector j = {0.0, 1.0, 0.0}; |
|||
vector k = {0.0, 0.0, 1.0}; |
|||
double l = 2.0, c, s, r, rprime; |
|||
vector qs[2]; |
|||
rotate(i, j, longitudeOfAscendingNode, qs); |
|||
i = qs[0]; j = qs[1]; |
|||
rotate(j, k, inclination, qs); |
|||
j = qs[0]; |
|||
rotate(i, j, argumentOfPeriapsis, qs); |
|||
i = qs[0]; j = qs[1]; |
|||
if (eccentricity != 1.0) l = 1.0 - eccentricity * eccentricity; |
|||
l *= semimajorAxis; |
|||
c = cos(trueAnomaly); |
|||
s = sin(trueAnomaly); |
|||
r = l / (1.0 + eccentricity * c); |
|||
rprime = s * r * r / l; |
|||
ps[0] = mulAdd(i, j, c, s); |
|||
ps[0] = mul(ps[0], r); |
|||
ps[1] = mulAdd(i, j, rprime * c - r * s, rprime * s + r * c); |
|||
ps[1] = div(ps[1], vabs(ps[1])); |
|||
ps[1] = mul(ps[1], sqrt(2.0 / r - 1.0 / semimajorAxis)); |
|||
} |
|||
int main() { |
|||
double longitude = 355.0 / (113.0 * 6.0); |
|||
vector ps[2]; |
|||
char buffer[80]; |
|||
orbitalStateVectors(1.0, 0.1, 0.0, longitude, 0.0, 0.0, ps); |
|||
vecAsStr(buffer, ps[0]); |
|||
printf("Position : %s\n", buffer); |
|||
vecAsStr(buffer, ps[1]); |
|||
printf("Speed : %s\n", buffer); |
|||
return 0; |
|||
}</lang> |
|||
{{output}} |
|||
<pre> |
|||
Position : (0.77942284339867973, 0.45000003465368416, 0) |
|||
Speed : (-0.55277084096044382, 0.95742708317976177, 0) |
|||
</pre> |
|||
=={{header|D}}== |
=={{header|D}}== |