private static List <Point2D> DoBasicMove(Point2D current, BasicPath path)
        {
            List <Point2D> result = new List <Point2D>();

            Point2D temp = current;

            result.Add(temp);

            for (int i = 0; i < path.NumberOfSteps - 1; i++)
            {
                temp = moves[(int)path[i]](temp, 1);

                result.Add(temp);
            }

            return(result);
        }
        public static List <Point2D> Construct(Point2D startPoint, int height, int width, BasicPath path, Jump jumpFunc)
        {
            List <Point2D> result = new List <Point2D>();

            if (height * width == path.NumberOfSteps)
            {
                return(DoBasicMove(startPoint, path));
            }

            int newHeight = height / path.Height;

            int newWidth = width / path.Width;

            Point2D tempPoint = startPoint;

            for (int i = 0; i < path.NumberOfSteps; i++)
            {
                result.AddRange(Construct(tempPoint, newHeight, newWidth, path.DoTransform(i), jumpFunc));

                tempPoint = jumpFunc(result[result.Count - 1], height, width, moves[(int)path[i]]);
            }

            return(result);
        }