private void PredictIntersection(SourceIntersections sourceIntersectionsEntry, int segmentIndex, OrbitalBody orbitalBody, Vector2 orbitalPosition, Vector2 orbitalVelocity, float timeToPosition, Trajectory trajectory, Color intersectionColor) { // Calculate time of flight of current object to destination Vector2 worldDestination = sourceIntersectionsEntry.SegmentIntersections[segmentIndex].ClosestPoint; Vector2 localDestination = (worldDestination - trajectory.ParentGravitySource.Position).RotateVector(-trajectory.ArgumentOfPeriapsis); float timeOfFlight = timeToPosition + OrbitalMechanics.UniversalVariableMethod.CalculateTimeOfFlight(orbitalPosition, orbitalVelocity, localDestination, trajectory.EccentricityVector, trajectory.ParentGravitySource.Mass); if (float.IsNaN(timeOfFlight)) { // timeOfFlight not properly calculated. hide sprites. sourceIntersectionsEntry.HideIntersectionObjects(segmentIndex); return; } // Plot current object's future position sourceIntersectionsEntry.InitiateIntersectionSprite(segmentIndex, sourceIntersectionsEntry.SegmentIntersections[segmentIndex].ClosestPoint, intersectionColor, true); // Plot this source object's position at timeOfFlight Vector2 predictedWorldPosition = sourceIntersectionsEntry.Source.PredictPosition(timeOfFlight); sourceIntersectionsEntry.InitiateIntersectionSprite(segmentIndex, predictedWorldPosition, intersectionColor, false); StartNewIntersectionCoroutine(orbitalBody, timeOfFlight, trajectory, sourceIntersectionsEntry, segmentIndex); }
private void UpdateIntersectionSprites(OrbitalBody orbitalBody, Trajectory trajectory, SourceIntersections sourceIntersectionsEntry, int segmentIndex) { // Calculate time of flight to next closest point -- FIXME: Still needed????? if (trajectory.TrajectoryType != OrbitalMechanics.Globals.TrajectoryType.Ellipse) { sourceIntersectionsEntry.HideIntersectionObjects(segmentIndex); return; } // Use trajectory period as timeOfFlight float timeOfFlight = trajectory.Period; Vector2 predictedWorldPosition = sourceIntersectionsEntry.Source.PredictPosition(timeOfFlight); sourceIntersectionsEntry.InitiateIntersectionSprite(segmentIndex, predictedWorldPosition, false); StartNewIntersectionCoroutine(orbitalBody, trajectory.Period, trajectory, sourceIntersectionsEntry, segmentIndex); }