我正在编写一个使用递归显示Hadamard模式的程序。
1 x 1 Hadamard图案是单个黑色正方形。通常,通过以2 x 2网格的形式对齐N x N图案的4个副本,然后反转右下N中所有正方形的颜色来获得2N x 2N Hadamard图案-by-N复制。
我想产生与this one相同的图片
我的代码是:
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);
}
}
我没有正确更改右下角正方形的颜色。在过去的几个小时中,我一直被困在此步骤中,希望有人能给我一个正确执行此操作的想法,因为我不知道。
先感谢您。
纳斯
最佳答案
您的代码不会反转右下象限,只是将其强制为白色。
我会说最好的解决方案是在递归方法中添加一个额外的参数(我们称其为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
的值选择白色或黑色。