import static util.SVGUtil.*;

public class Penrose {
	private static int color;
	private static int dcolor = 1;

	private static void penroseM(int n, double d) {
	    if (n == 0) return;
	    penroseO(n - 1, d);
	    penroseA(n - 1, d);
	    turn(36);
	    turn(36);
	    penroseP(n - 1, d);
	    penroseA(n - 1, d);
	    turn(-36);
	    turn(-36);
	    turn(-36);
	    turn(-36);
	    penroseN(n - 1, d);
	    penroseA(n - 1, d);
	    pushTurtle();
	    turn(-36);
	    penroseO(n - 1, d);
	    penroseA(n - 1, d);
	    turn(-36);
	    turn(-36);
	    turn(-36);
	    turn(-36);
	    penroseM(n - 1, d);
	    penroseA(n - 1, d);  
	    popTurtle();   
	    turn(36);
	    turn(36);  
	}

	private static void penroseN(int n, double d) {
	    if (n == 0) return;
	    turn(36);
	    penroseO(n - 1, d);
	    penroseA(n - 1, d);
	    turn(-36);
	    turn(-36);
	    penroseP(n - 1, d);
	    penroseA(n - 1, d);
	    pushTurtle();
	    turn(-36);
	    turn(-36);
	    turn(-36);
	    penroseM(n - 1, d);
	    penroseA(n - 1, d);   
	    turn(-36);
	    turn(-36);
	    penroseN(n - 1, d);
	    penroseA(n - 1, d);
	    popTurtle();
	    turn(36);   
	}

	private static void penroseO(int n, double d) {
	    if (n == 0) return;
	    turn(-36);
	    penroseM(n - 1, d);
	    penroseA(n - 1, d);
	    turn(36);
	    turn(36);
	    penroseN(n - 1, d);
	    penroseA(n - 1, d);
	    pushTurtle();
	    turn(36);
	    turn(36);
	    turn(36);
	    penroseO(n - 1, d);
	    penroseA(n - 1, d);   
	    turn(36);
	    turn(36);
	    penroseP(n - 1, d);
	    penroseA(n - 1, d);
	    popTurtle();
	    turn(-36);     
	}

	private static void penroseP(int n, double d) {
	    if (n == 0) return;
	    turn(-36);
	    turn(-36); 
	    penroseO(n - 1, d);
	    penroseA(n - 1, d);
	    turn(36);
	    turn(36);
	    turn(36);
	    turn(36);
	    penroseM(n - 1, d);
	    penroseA(n - 1, d);
	    pushTurtle();
	    turn(36);
	    penroseP(n - 1, d);
	    penroseA(n - 1, d);
	    turn(36);
	    turn(36);
	    turn(36);
	    turn(36);
	    penroseN(n - 1, d);
	    penroseA(n - 1, d);
	    popTurtle();
	    turn(-36);
	    turn(-36);
	    penroseN(n - 1, d);
	    penroseA(n - 1 , d);
	}

	private static void penroseA(int n, double d) {
	    if (n == 0) {
	        forward(d);
	        stroke(color = rotateH360(color, dcolor));
	        return;
	    } else {
	        return;
	    }
	}

	private static void penroseMain(int n, double d) {
	    pushTurtle();
	    penroseN(n, d);
	    popTurtle();
	    turn(36);
	    turn(36);
	    pushTurtle();
	    penroseN(n, d);
	    popTurtle();
	    turn(36);
	    turn(36);
	    pushTurtle();
	    penroseN(n, d);
	    popTurtle();
	    turn(36);
	    turn(36);
	    pushTurtle();
	    penroseN(n, d);
	    popTurtle();
	    turn(36);
	    turn(36);
	    pushTurtle();
	    penroseN(n, d);
	    popTurtle();
	}


	public static void main(String[] args) {
	    start();
	    stroke(color = hsb360(0, 100, 100));
	    strokeWeight(0.5);
	    penroseMain(5, 10);
	    finish();
	}
}
