IEnumerable <RendezvousTrajectory> scan_start_time() { var cur = P; var prev = P; var bestP = cur; var bestOK = feasible_point(bestP); var endUT = Math.Max(P.start + P.transfer * 2, maxStartUT); var maxTT = maxStartUT - minStartUT; var minZ = new MinimumD(); while (cur.start < endUT) { var requestedTT = cur.transfer; cur.UpdateTrajectory(true); var tOK = feasible_point(cur); if ((bestOK && tOK && cur < bestP) || !bestOK && (tOK || cur.trajectory.Orbit.PeR > bestP.trajectory.Orbit.PeR)) { //always add the first feasable point if (tOK && !bestOK) { start_points.Add(cur); } bestP = cur; bestOK = tOK; } if (bestOK) { minZ.Update(cur.distance); if (minZ.True && feasible_point(prev)) { start_points.Add(prev); } var step_k = Point.DistK(prev, cur); if (step_k.Equals(0)) { step_k = 1; } prev = cur; cur.start += dT * step_k; } else { cur.transfer += dT; if (cur.transfer > maxTT || requestedTT - cur.transfer > 1) { cur.transfer = 1; cur.start += dT / 10; } } yield return(cur.trajectory); } if (!bestOK) { P = bestP; foreach (var t in find_first_point()) { yield return(t); } bestP = P; } if (!start_points.Contains(bestP)) { start_points.Add(bestP); } set_dir(new Vector2d(1, 0)); for (int i = 0, minimaCount = start_points.Count; i < minimaCount; i++) { P = start_points[i]; foreach (var t in find_minimum(dT, true)) { yield return(t); } start_points[i] = P; } }