/*
 * Rotate.java
 *
 * Created on July 11, 2002, 2:14 PM
 */

package hilbert;

/**
 *
 * @author  ex11487
 * @version 
 */
import java.io.*;

public class Hilbert implements Dadim {

    Dadim dadim;
    int stage=0;
    
    public Hilbert(Dadim dadim) {
        this(dadim, 0);
    }
    
    public Hilbert(Dadim dadim, int stage) {
        this.dadim=dadim;
        this.stage= stage;
    }
    
    public Object value() {
        return dadim.value();
    }
    
    public void trans(int dir, int length) {
        if (dir==2) {
            switch (stage) {
                case 0: 
                    dadim.trans(0, 1);
                    dadim= new Rotate(dadim);
                    dadim= new Mirror(dadim);
                    break;
                case 1:
                    dadim.trans(0, 1);
                    break;
                case 2:
                    dadim.trans(1, -1);
                    dadim= new Mirror(dadim);
                    dadim= new Rotate(dadim);
                    break;
                case 3:
                    dadim.trans(2,1);
                    dadim= new Rotate(dadim);
                    dadim= new Rotate(dadim);
                    break;
            }
            stage= (stage+1)&3;
        } else 
            dadim.trans(dir, length);
    }
    
    public Dadim zoom(int dir) {
        switch (dir) {
            case 2: 
                return new Hilbert(new Mirror(new Rotate(new Hilbert(dadim.zoom(0).zoom(1), stage))));
            default: 
                return new Hilbert(dadim.zoom(dir), stage);
        }
    }
    
    public static void main(String args[]) throws Exception {
        PrintStream out= new PrintStream(new FileOutputStream("p:/phil/hilbert"));
        
        Dadim dadim= new Hilbert(new Mirror(new Rotate(new Point())));
        dadim= dadim.zoom(2);
        dadim= dadim.zoom(2);
        dadim= dadim.zoom(2);
        for (int i=0; i<256; ++i) {
            //if (i==64 || i==32)
            //    dadim=dadim.zoom(2);
            System.out.println(dadim.value());
            out.println(dadim.value());
            dadim.trans(2, 1);
        }
        out.close();
    }

}
