use <maze/mz_hamiltonian.scad>

rows = 2;
columns = 2;
start = [0, 0];
width = .5;
height = .05;
test_torii = "FALSE"; // [TRUE, FALSE]

if(test_torii == "TRUE") {
    rotate([90, 0, 0])
        torii_symbol();
}
else {
    senbon_torii(
        rows = rows, 
        columns = columns,
        start = start,
        width = width,
        height = height
    ) {
        torii_symbol();
        top_symbol();
    };
}

module senbon_torii(rows, columns, start, width, height) {
    line = mz_hamiltonian(rows, columns, start);
    leng = len(line);
    min_h = 0.1;

    // first torii
    fst = line[0];
    snd = line[1];
    
    translate([fst[0], fst[1], min_h])
    rotate([90, 0, atan2(snd[0] - fst[0], snd[1] - fst[1])]) 
        children(0);     
               
    module middle_torii(i) {
        p1 = line[i];
        p2 = line[i + 1];
        md = (p1 + p2) / 2;
        h = i * height + min_h; 

        a1 = atan2(p2[0] - p1[0], p2[1] - p1[1]);
        
        translate([md[0], md[1], h + height / 2]) 
        rotate([90, 0, a1]) 
            children(0);       
 
        // road
        hull() {
            translate(p1) 
            linear_extrude(h)
                square(width, center = true);      

            translate(p2) 
            linear_extrude((i + 1) * height + min_h)
                square(width, center = true);     
        }      
    }    
    
    // second torii
    middle_torii(0) 
        children(0);

    // middle torris               
    for(i = [1:leng - 2]) {
        middle_torii(i) 
            children(0);
            
        p0 = line[i - 1];
        p1 = line[i];
        p2 = line[i + 1];
        h = i * height + min_h; 
        
        a1 = atan2(p2[0] - p1[0], p2[1] - p1[1]);
        a2 = atan2(p1[0] - p0[0], p1[1] - p0[1]);
        translate([p1[0], p1[1], h])
        rotate([90, 0, a1 + (a1 - a2) / 2])     
            children(0); 
    }
    
    // top
    lst = line[leng - 1];
    pre_lst = line[leng - 2];
    la = atan2(lst[0] - pre_lst[0], lst[1] - pre_lst[1]);
    
    translate([lst[0], lst[1], (leng - 1) * height + min_h])
    rotate([90, 0, la]) 
        children(1);     
}

module torii_symbol() {
    // design your own symbol
    linear_extrude(.1, center = true) 
    scale(1.25) 
    translate([-0.0125, 0.075])
        text("⛩", font = "Segoe UI Emoji", size = 0.5 * 0.7, halign = "center");
}

module top_symbol() {
    // design your own symbol
    translate([-0.01295, -0.0275]) {
        linear_extrude(.2, center = true)     
        scale([0.975, 1.75])
            text("🏔", font = "Segoe UI Emoji", size = 0.45 * 0.7, halign = "center"); 
    }
}