On 10/12/2011 12:10 PM, David Scheidt wrote:
the mean anomoly sure looks like an equation to me.
Now, translate mean anomaly into an actual position.
Anyway, in many situations it may be better to just use brute force
crunch instead of trying to find a formula. For example, the attached
code produces an error of less than 1 ppm in a single orbital period
despite only 20,000 iterations, which is plenty of accuracy for the
intended use.
#include <math.h>
#define GRAVITY 1
static double x=1, y=0, vx=0, vy=1, time=0;
void
apply_gravity( double dt )
{
double dx=dt*vx, dy=dt*vx, tx, ty, dist, ax, ay;
tx = x + dx/2; ty = y + dy/2;
dist = sqrt( tx * tx + ty * ty );
ax = GRAVITY * -tx / (dist*dist*dist);
ay = GRAVITY * -ty / (dist*dist*dist);
dx = dt * vx + 0.5 * ax * dt * dt;
dy = dt * vy + 0.5 * ay * dt * dt;
/* some iteration... */
tx = x + dx/2; ty = y + dy/2;
dist = sqrt( tx * tx + ty * ty );
ax = GRAVITY * -tx / (dist*dist*dist);
ay = GRAVITY * -ty / (dist*dist*dist);
dx = dt * vx + 0.5 * ax * dt * dt;
dy = dt * vy + 0.5 * ay * dt * dt;
x += dx; y += dy; vx += ax * dt; vy += ay * dt;
time += dt;
}
main() {
int i;
for( i = 0; i < 5000; i++ ) apply_gravity( M_PI * 0.0001 );
printf("pos at T=%f: %f X, %f Y\n", time, x, y );
for( i = 0; i < 5000; i++ ) apply_gravity( M_PI * 0.0001 );
printf("pos at T=%f: %f X, %f Y\n", time, x, y );
for( i = 0; i < 5000; i++ ) apply_gravity( M_PI * 0.0001 );
printf("pos at T=%f: %f X, %f Y\n", time, x, y );
for( i = 0; i < 5000; i++ ) apply_gravity( M_PI * 0.0001 );
printf("pos at T=%f: %g X, %g Y\n", time, x, y );
}
_______________________________________________
GurpsNet-L mailing list <[email protected]>
http://mail.sjgames.com/mailman/listinfo/gurpsnet-l