#include <math.h>
#include "svg.h"

void penroseM(int n, double d);
void penroseN(int n, double d);
void penroseO(int n, double d);
void penroseP(int n, double d);
void penroseA(int n, double d);

int color;
int dcolor = 1;

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);  
}

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);   
}

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);     
}

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);
}

void penroseA(int n, double d) {
    if (n == 0) {
        forward(d);
        stroke(color = rotateH360(color, dcolor));
        return;
    } else {
        return;
    }
}

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();
}


int main(void) {
    start();
    stroke(color = hsb360(0, 100, 100));
    strokeWeight(0.5);
    penroseMain(3, 10);
    finish();
    return 0;
}
