В настоящее время я пытаюсь реализовать рекурсивное решение для 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);
}