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;
                }
            }