我正在编写一个使用递归显示Hadamard模式的程序。
1-by-1 Hadamard模式是单个黑色方块。通常,通过以2×2网格的形式对齐4个N-by-N图案的副本,然后反转右下N中所有正方形的颜色,获得2N×2N的Hadamard图案。 -by-N copy。
我想生成与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);
}
}
我没有正确更改右下角的方块颜色。我在最后几个小时一直坚持这一步,并希望有人能让我知道如何正确地做到这一点,因为我不知道。
提前谢谢你。 纳特
答案 0 :(得分:3)
你的代码不是反转右下象限,它只是强制它是白色的。
我想说最好的解决方案是在递归方法中添加一个额外的参数(让我们称之为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
的值选择白色或黑色。