/// <summary> /// Traces a massive body orbit by re-centering the world around the parent. /// </summary> public static OrbitTrace TraceMassiveBody(MassiveBodyBase body) { IMassiveBody parent = body.GravitationalParent; DVector2 initialPosition = body.Position - parent.Position; var proxyParent = new MassiveBodyProxy(DVector2.Zero, DVector2.Zero, parent); var proxySatellite = new MassiveBodyProxy(initialPosition, body.Velocity - parent.Velocity, body); double orbitalTerminationRadius; double altitude = body.GetRelativeAltitude(); double orbitalDt = GetOrbitalDt(initialPosition, proxySatellite.Velocity, out orbitalTerminationRadius); var trace = new OrbitTrace(body.Position, altitude); for (int i=0; i < 300; i++) { proxySatellite.ResetAccelerations(); proxySatellite.ResolveGravitation(proxyParent); proxySatellite.Update(orbitalDt); altitude = proxyParent.GetRelativeHeight(proxySatellite.Position); // Check expensive termination conditions after half of the iterations if (i > 150) { DVector2 offsetVector = proxySatellite.Position - initialPosition; double distanceFromStart = offsetVector.Length(); // Terminate and add the end point if (distanceFromStart < orbitalTerminationRadius) { trace.AddPoint(proxySatellite.Position + parent.Position, altitude); break; } } trace.AddPoint(proxySatellite.Position + parent.Position, altitude); } return trace; }