Рекурсивная реализация ковра Серпинского - PullRequest
0 голосов
/ 20 октября 2019

В настоящее время я пытаюсь реализовать рекурсивное решение для Sierpinski Carpet - это было сделано много раз, но у меня есть несколько различных параметров, которые мне дают, которые бросают в моей голове, и я не могу показатьсячтобы выяснить, где я застреваю.

Вот рекурсивный метод, который я написал -

Примечание - этот метод первоначально вызывается с параметрами (0, 10, 1). Также

public static final int WIDTH = 1000, HEIGHT = 750;
public static final int MIN_SIZE = 2;

- это некоторые константы, которые мне даны, базовый случай здесь, когда ширина или высота нарисованного блока меньше, чем MIN_SIZE в пикселях, которые можно рассчитать, умножив на WIDTH иКонстанты HEIGHT.

Моя идея для решения этой проблемы заключалась в том, чтобы получить значения minX, maxX, minY и maxY, разделить их диапазоны на 3, нарисовать в центральном квадрате, который будет в ((maxX +minX) / 2, (maxY + minY) / 2), а затем продолжить, рекурсивно вызывая 8 окружающих квадратов, кратные третьему, который я вычислил (можно увидеть в коде).

Однако этоэто то, что я получаю ... Рекурсия только в нижнем левом углу

Я почти уверен, что это, вероятно, самое простое решение, которого я не вижу, может кто-нибудь его увидеть?

public static void recursiveRectangleFill(double minX, double maxX, double minY, double maxY){
          double width = (maxX - minX) / 3.0;
          double height = (maxY - minY) / 3.0;

          if(width * WIDTH < MIN_SIZE || height * HEIGHT < MIN_SIZE) return;

        //middle square
          double midX = (maxX + minX) / 2.0;
          double midY = (maxY + minY) / 2.0;

          //Middle square, draw it
        StdDraw.setPenColor(new Color((float) Math.random(), (float) Math.random(), (float) Math.random()));
          StdDraw.filledRectangle(midX, midY, width / 2, height / 2);

          //Bottom left
          recursiveRectangleFill(0, width, 0, height);

          //Middle Left
          recursiveRectangleFill(0, width, height, 2 * height);

          //Top left
          recursiveRectangleFill(0, width, 2 * height, 3 * height);

          //Middle bottom
          recursiveRectangleFill(width, 2 * width, 0, height);

          //Top middle
          recursiveRectangleFill(width, 2 * width, 2 * height, 3 * height);

          //Bottom right
          recursiveRectangleFill(2 * width, 3 * width, 0, height);

          //Middle right
          recursiveRectangleFill(2 * width, 3 * width, height, 2 * height);

          //Top right
          recursiveRectangleFill(2 * width, 3 * width, 2 * height, 3 * height);        
  }
...