public static List <Waypoint> CreateWithFixedStep(Waypoint start, double length, double stepInMeter, double angleRad, Func <int, string> namingRule)
        {
            angleRad = Math.PI / 2 - angleRad;

            var p = new List <Waypoint>();

            var counter = 0;
            var pos     = 0.0;

            var xy = WgsUtmConverter.LatLonToUTMXY(start.Location, 0);

            while (pos < length)
            {
                var stepX = Math.Cos(angleRad) * pos;
                var stepY = Math.Sin(angleRad) * pos;

                var latLon = WgsUtmConverter.UTMXYToLatLon(xy.Shift(stepX, stepY), start.Location.Latitude < 0);

                p.Add(new Waypoint(namingRule(counter), latLon));

                counter++;
                pos += stepInMeter;
            }

            return(p);
        }
        public static List <Waypoint> CreateWithFixedStep(List <Waypoint> keyPoints, double stepInMeter, Func <int, string> namingRule)
        {
            var p = new List <Waypoint>();

            double r = 0.0;

            int counter = 0;

            for (int i = 1; i < keyPoints.Count; i++)
            {
                var p1 = keyPoints[i - 1];
                var p2 = keyPoints[i];

                var xy1 = WgsUtmConverter.LatLonToUTMXY(p1.Location, 0);
                var xy2 = WgsUtmConverter.LatLonToUTMXY(p2.Location, xy1.Zone);

                var dx = xy2.X - xy1.X;
                var dy = xy2.Y - xy1.Y;

                var a = Math.Atan(Math.Abs(dy / dx));

                var len = Math.Sqrt(dx * dx + dy * dy);

                var pos = r;

                while (pos < len)
                {
                    var stepX = dx > 0 ? Math.Cos(a) * pos : -Math.Cos(a) * pos;
                    var stepY = dy > 0 ? Math.Sin(a) * pos : -Math.Sin(a) * pos;

                    var latLon = WgsUtmConverter.UTMXYToLatLon(xy1.Shift(stepX, stepY), p1.Location.Latitude < 0);

                    p.Add(new Waypoint(namingRule(counter), latLon));

                    counter++;
                    pos += stepInMeter;
                }

                r = pos - len;
            }

            return(p);
        }