递归变化变量 - Sierpinski地毯

时间:2018-04-20 16:17:03

标签: java image recursion

我在使用sierpinski地毯时遇到了一些问题,并且会提供任何帮助。

我能够定义停止条件,绘制中心矩形,并递归地绘制图像的下一级,同时保持计数。

恰巧我只能在左上方画画。我会说我混淆了变量,但我似乎无法弄明白。会不会提供任何帮助

这是我遇到问题的代码的一部分。

    int smallerWidth = newWidth / 3;
    int smallerHeight = newHeight / 3;

    int sX = 0;
    int sY = 0;
    if (currentDeep > 1) {
        for (int i = 0; i < 3; i++) {
            sX = width / 9 + (i * 3 * (width / 9));
            sY = height / 9;
            g.fillRect(sX, sY, smallerWidth, smallerHeight);
            for (int j = 0; j < 3; j++) {
                sY = height / 9 + (j * 3 * (height / 9));
                g.fillRect(sX, sY, smallerWidth, smallerHeight);
            }
        }
        return 1 + printSquares(g, sX, sY, newWidth, newHeight, currentDeep 
                                                  - 1);
    } else
        return 1;
}

这是完整的代码 https://pastebin.com/WPJ5tG8w

总而言之,我的问题是。我应该更改/创建什么才能让我的程序绘制剩余的7个方块?

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是,您尝试一次执行递归的多个层的操作。通常,在递归中,您只绘制Quadrado中心,计算较小矩形的大小和坐标,并递归调用该方法。这样你就可以确保递归调用不会影响已经存在的东西。

private int printSquares(Graphics g, int xi, int yi, int width, int height, int currentDeep) {
    //Quadrado central
    int newWidth = width / 3;
    int newHeight = height / 3;
    int x = (width / 3) + xi;
    int y = (height / 3) + yi;
    g.fillRect(x, y, newWidth, newHeight);

    int sX = 0;
    int sY = 0;
    if (currentDeep > 1) {
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                //This is the position of each of the small rectangles
                sX = i * (width / 3) + xi;
                sY = j * (height / 3) + yi;

                // Call the method recursively in order to draw the smaller rectangles
                sum += printSquares(g, sX, sY, newWidth, newHeight, currentDeep - 1);
            }
        }
        return 1 + sum;
    } else
        return 1;
}

我希望,这可以解决你的问题。