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