Displaced, in order

displaced grid, horizontal and vertical separated

Log in to post a comment.

const offset = 90;
const spread = 10; // min=3 max=20 step=1
const row_count = 20; // min=2 max=80 step=1
const col_count = 20; // min=2 max=80 step=1
const steps_amt = 5; // min=1 max=40 step=1
const jitter_amt = 0.8 // min=0.1 max=3 step=0.1

const base_matrix_horizontal = [];
for (let r = 0; r < row_count; r += 1) {
    base_matrix_horizontal[r] = [];
    for (let c = 0; c < col_count; c += 1) {
        base_matrix_horizontal[r].push(jitter([c, r]))
    }
}

const base_matrix_vertical = transpose(base_matrix_horizontal);

const matrix_horizontal = interp_matrix(base_matrix_horizontal);
const matrix_vertical = interp_matrix(base_matrix_vertical);

Canvas.setpenopacity(1);

const turtle = new Turtle();
turtle.penup();

function walk(i) {
    walk_matrix(transpose(matrix_horizontal));
    walk_matrix(transpose(matrix_vertical));
}

function walk_matrix(matrix) {
    for (let r = 0; r < matrix.length; r += 1) {
        for (let c = 0; c < matrix[r].length; c += 1) {
            const coord = matrix[r][c];
            const x = (coord[0] * spread) - offset;
            const y = (coord[1] * spread) - offset;
    
            turtle.goto(x, y);
            turtle.pendown();
        }
        turtle.penup();
    }
}

function transpose(matrix) {
    return matrix[0].map(
        (_, colIdx) => matrix.map(
            (row) => row[colIdx]
        )
    )
}

function jitter([x, y], amt = jitter_amt) {
    return [
        x + (Math.random() * amt) - amt/2,
        y + (Math.random() * amt) - amt/2
    ]
}

function interp([x1, y1], [x2, y2], steps = steps_amt) {
    const x_step = (x2 - x1) / steps;
    const y_step = (y2 - y1) / steps;
    
    const coords = []
    for (let i = 1; i < steps; i += 1) {
        coords.push([
            x1 + x_step * i,
            y1 + y_step * i
        ]);
    }
    
    return coords;
}

function interp_matrix(base_matrix) {
    const matrix = [];
    for (let r = 0; r < base_matrix.length; r += 1) {
        matrix[r] = []
        for (let c = 0; c + 1 < base_matrix[r].length; c += 1) {
            const coord_1 = base_matrix[r][c];
            const coord_2 = base_matrix[r][c+1];
            matrix[r].push(coord_1);
            matrix[r].push(...interp(coord_1, coord_2));
            if (c + 2 === base_matrix[r].length) {
                matrix[r].push(coord_2);
            }
        }
    }
    return matrix;
}