Вопрос по шаблону Адамара

#java #recursion

#java #рекурсия

Вопрос:

Я пишу программу, которая отображает шаблон Адамара с использованием рекурсии.

Шаблон Адамара размером 1 на 1 представляет собой один черный квадрат. В общем случае шаблон Адамара размером 2N на 2N получается путем выравнивания 4 копий шаблона N на N в виде сетки размером 2 на 2, а затем инвертирования цветов всех квадратов в нижней правой копии размером N наN.

Я хотел бы создать ту же картинку, что и эта

Мой код:

 import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class Hadamard extends JPanel{


@SuppressWarnings("unused")
private void hadamard(Graphics g, int n, int x, int y, int width, int height){

    if(n == 0){

        g.fillRect(x/2, y/2, width, height);
        return;
    }
    else{

        hadamard(g, n-1, x, y, width/2, height/2);

        hadamard(g, n-1, x   width, y,  width/2, height/2);

        hadamard(g, n-1, x, y   height, width/2, height/2);

        g.setColor(Color.WHITE);
        hadamard(g, n-1, x   width, y   height, width/2, height/2);
        g.setColor(Color.BLACK);


    }
}

protected void paintComponent(Graphics g){
    super.paintComponent(g);

    hadamard(g, 2, getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2);

}

public static void main(String[] args) {

    Hadamard panel = new Hadamard();
    JFrame app = new JFrame();

    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    app.add(panel);
    app.setSize(516, 538);
    app.setVisible(true);

}
  

}

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

Заранее благодарю вас. Nath

Ответ №1:

Ваш код не инвертирует нижний правый сектор, он просто заставляет его быть белым.

Я бы сказал, что лучшим решением является добавление дополнительного параметра к вашему рекурсивному методу (назовем его b ), значение которого может быть true или false . Затем вы можете выполнить рекурсию как:

     hadamard(g, n-1, x, y, width/2, height/2, b);
    hadamard(g, n-1, x   width, y,  width/2, height/2, b);
    hadamard(g, n-1, x, y   height, width/2, height/2, b);
    hadamard(g, n-1, x   width, y   height, width/2, height/2, !b);
  

Затем, когда вы перейдете к fillRect вызовам, выберите белый или черный в зависимости от значения b .

Комментарии:

1. @Oli Следуя вашему совету, я изменил свой код:`private void hadamard (графика g, int n, int x, int y, int width, int height, логическое значение b){ if(n == 0){ if (b == true) g.setColor(Цвет. ЧЕРНЫЙ); иначе g.setColor(Цвет. БЕЛЫЙ); g.fillRect(x/2, y /2, width, height); return; } else{ адамар (g, n-1, x, y, width/2, height/2, true); адамар (g, n-1, x width, y, width/2, height/2, true); адамар(g, n-1, x, y height, width/2, height/2, true); адамар(g, n-1, x, y height, width/2, height/2, true); адамар (g, n-1 , x ширина, y высота, width/2, высота/2, false); } }`

2. @Nath: Это все равно не сработает. Вы жестко кодируете значение b при рекурсивных вызовах!

3. @Oli Как я могу отформатировать свой код в удобочитаемом формате? Я использовал code , но код не похож на тип блока.

4. @Nath: Если вы пишете в комментарии, вы можете поместить код между обратными ссылками. Но я рекомендую отредактировать ваш вопрос, чтобы включить в него ваш новый код.

5. @Oli — Я понял. Я исправил код. Это отлично работает. Большое тебе спасибо за твою помощь, Оли. Я ценю это.