2011-06-01 70 views
1

我在寫一個使用遞歸顯示Hadamard模式的程序。Hadamard模式問題

1乘1 Hadamard圖案是單個黑色方塊。一般來說,2N乘2N的Hadamard圖案是通過將2×2網格形式的N×N圖案的4個副本對齊,然後反轉右下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); 

} 

}

我不改變的平方正確的顏色在右下角。在過去的幾個小時裏,我一直被困在這一步,希望有人會給我一個想法,因爲我不知道如何正確地做到這一點。

預先感謝您。 納特

回答

3

你的代碼是不是反轉右下象限,它只是迫使它是白色的。

我會說最好的解決方案是爲遞歸方法添加一個額外的參數(我們稱之爲b),其值可以是truefalse。然後,您可以遞歸爲:

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值。

+0

謝謝你的回覆,Oli。 – Nath 2011-06-01 23:40:37

+0

@Oli按照你的意見,我改變了我的代碼:'私人無效阿達瑪(圖形克,詮釋N,INT X,INT Y,INT寬度,高度INT,布爾B){ \t \t \t \t 如果(N == 0 ){ \t if(b == true) \t g.setColor(Color.BLACK); \t else \t g.setColor(Color.WHITE); g。 \t g。fillRect(x/2,y/2,width,height); \t return; \t} \t else { \t hadamard(g,n-1,x,y,width/2,height/2,true); \t \t \t \t hadamard(g,n-1,x + width,y,width/2,height/2,true); \t \t \t \t hadamard(g,n-1,x,y + height,width/2,height/2,true); \t \t \t \t hadamard(g,n-1,x + width,y + height,width/2,height/2,false); \t \t \t \t \t \t \t \t \t \t \t \t \t \t} \t}' – Nath 2011-06-01 23:43:35

+0

@Nath:這仍然是行不通的。你在遞歸調用中硬編碼'b'的值! – 2011-06-01 23:46:30