16 tiles
Log in to post a comment.
const SIZE = 12; // min=10, max=20, step=1
const cell = 200 / SIZE
const cell_r = cell / 2
Canvas.setpenopacity(1);
const t = new Turtle();
const tube_r = cell * 0.25
const tube_r2 = cell * 0.3
const seam_r = cell * 0.05
const cross_r = seam_r
function draw_tile(x, y, left, up, right, down) {
let x0 = -100 + x * cell
let x1 = x0 + cell
let cx = x0 + cell_r
let y0 = -100 + y * cell
let y1 = y0 + cell
let cy = y0 + cell_r
// common: seams
if (left) {
t.jump(x0, y0 + cell_r - tube_r2)
t.goto(x0 + seam_r, y0 + cell_r - tube_r2)
t.goto(x0 + seam_r, y0 + cell_r + tube_r2)
t.goto(x0, y0 + cell_r + tube_r2)
}
if (right) {
t.jump(x1, y0 + cell_r - tube_r2)
t.goto(x1 - seam_r, y0 + cell_r - tube_r2)
t.goto(x1 - seam_r, y0 + cell_r + tube_r2)
t.goto(x1, y0 + cell_r + tube_r2)
}
if (up) {
t.jump(x0 + cell_r - tube_r2, y0)
t.goto(x0 + cell_r - tube_r2, y0 + seam_r)
t.goto(x0 + cell_r + tube_r2, y0 + seam_r)
t.goto(x0 + cell_r + tube_r2, y0)
}
if (down) {
t.jump(x0 + cell_r - tube_r2, y1)
t.goto(x0 + cell_r - tube_r2, y1 - seam_r)
t.goto(x0 + cell_r + tube_r2, y1 - seam_r)
t.goto(x0 + cell_r + tube_r2, y1)
}
// common: bckg
// t.jump(x0, y0)
// t.goto(x0 + cross_r, y0 + cross_r)
// t.jump(x0, y1)
// t.goto(x0 + cross_r, y1 - cross_r)
// t.jump(x1, y0)
// t.goto(x1 - cross_r, y0 + cross_r)
// t.jump(x1, y1)
// t.goto(x1 - cross_r, y1 - cross_r)
// 0 sides
if (!left && !up && !right && !down) {
}
// 1 side
if (left && !up && !right && !down) {
t.jump(x0 + seam_r, cy - tube_r)
t.setheading(0)
t.forward(cell_r - seam_r)
t.circle(tube_r, 180)
t.forward(cell_r - seam_r)
}
if (!left && up && !right && !down) {
t.jump(cx + tube_r, y0 + seam_r)
t.setheading(90)
t.forward(cell_r - seam_r)
t.circle(tube_r, 180)
t.forward(cell_r - seam_r)
}
if (!left && !up && right && !down) {
t.jump(x1 - seam_r, cy + tube_r)
t.setheading(180)
t.forward(cell_r - seam_r)
t.circle(tube_r, 180)
t.forward(cell_r - seam_r)
}
if (!left && !up && !right && down) {
t.jump(cx - tube_r, y1 - seam_r)
t.setheading(-90)
t.forward(cell_r - seam_r)
t.circle(tube_r, 180)
t.forward(cell_r - seam_r)
}
// 2 sides straight
if (left && !up && right && !down) {
t.jump(x0 + seam_r, cy - tube_r)
t.goto(x1 - seam_r, cy - tube_r)
t.jump(x0 + seam_r, cy + tube_r)
t.goto(x1 - seam_r, cy + tube_r)
}
if (!left && up && !right && down) {
t.jump(cx - tube_r, y0 + seam_r)
t.goto(cx - tube_r, y1 - seam_r)
t.jump(cx + tube_r, y0 + seam_r)
t.goto(cx + tube_r, y1 - seam_r)
}
// 2 sides turn
if (left && up && !right && !down) {
t.jump(cx + tube_r, y0 + seam_r)
t.setheading(90)
t.forward(cell_r - seam_r)
t.circle(tube_r, 90)
t.forward(cell_r - seam_r)
t.jump(cx - tube_r, y0 + seam_r)
t.setheading(90)
t.forward(2 * seam_r)
t.circle(cell_r - tube_r - 3 * seam_r, 90)
t.forward(2 * seam_r)
}
if (!left && up && right && !down) {
t.jump(x1 - seam_r, cy + tube_r)
t.setheading(180)
t.forward(cell_r - seam_r)
t.circle(tube_r, 90)
t.forward(cell_r - seam_r)
t.jump(x1 - seam_r, cy - tube_r)
t.setheading(180)
t.forward(2 * seam_r)
t.circle(cell_r - tube_r - 3 * seam_r, 90)
t.forward(2 * seam_r)
}
if (!left && !up && right && down) {
t.jump(cx - tube_r, y1 - seam_r)
t.setheading(-90)
t.forward(cell_r - seam_r)
t.circle(tube_r, 90)
t.forward(cell_r - seam_r)
t.jump(cx + tube_r, y1 - seam_r)
t.setheading(-90)
t.forward(2 * seam_r)
t.circle(cell_r - tube_r - 3 * seam_r, 90)
t.forward(2 * seam_r)
}
if (left && !up && !right && down) {
t.jump(x0 + seam_r, cy - tube_r)
t.setheading(0)
t.forward(cell_r - seam_r)
t.circle(tube_r, 90)
t.forward(cell_r - seam_r)
t.jump(x0 + seam_r, cy + tube_r)
t.setheading(0)
t.forward(2 * seam_r)
t.circle(cell_r - tube_r - 3 * seam_r, 90)
t.forward(2 * seam_r)
}
// 3 sides
if (left && up && right && !down) {
t.jump(x0 + seam_r, cy + tube_r)
t.goto(x1 - seam_r, cy + tube_r)
t.jump(x0 + seam_r, cy - tube_r)
t.goto(cx - tube_r, cy - tube_r)
t.goto(cx - tube_r, y0 + seam_r)
t.jump(x1 - seam_r, cy - tube_r)
t.goto(cx + tube_r, cy - tube_r)
t.goto(cx + tube_r, y0 + seam_r)
t.jump(cx + tube_r, cy - tube_r)
t.setheading(150)
t.circle(2 * tube_r, 60)
}
if (!left && up && right && down) {
t.jump(cx - tube_r, y0 + seam_r)
t.goto(cx - tube_r, y1 - seam_r)
t.jump(cx + tube_r, y0 + seam_r)
t.goto(cx + tube_r, cy - tube_r)
t.goto(x1 - seam_r, cy - tube_r)
t.jump(cx + tube_r, y1 - seam_r)
t.goto(cx + tube_r, cy + tube_r)
t.goto(x1 - seam_r, cy + tube_r)
t.jump(cx + tube_r, cy + tube_r)
t.setheading(-120)
t.circle(2 * tube_r, 60)
}
if (left && !up && right && down) {
t.jump(x0 + seam_r, cy - tube_r)
t.goto(x1 - seam_r, cy - tube_r)
t.jump(x0 + seam_r, cy + tube_r)
t.goto(cx - tube_r, cy + tube_r)
t.goto(cx - tube_r, y1 - seam_r)
t.jump(x1 - seam_r, cy + tube_r)
t.goto(cx + tube_r, cy + tube_r)
t.goto(cx + tube_r, y1 - seam_r)
t.jump(cx - tube_r, cy + tube_r)
t.setheading(-30)
t.circle(2 * tube_r, 60)
}
if (left && up && !right && down) {
t.jump(cx + tube_r, y0 + seam_r)
t.goto(cx + tube_r, y1 - seam_r)
t.jump(cx - tube_r, y0 + seam_r)
t.goto(cx - tube_r, cy - tube_r)
t.goto(x0 + seam_r, cy - tube_r)
t.jump(cx - tube_r, y1 - seam_r)
t.goto(cx - tube_r, cy + tube_r)
t.goto(x0 + seam_r, cy + tube_r)
t.jump(cx - tube_r, cy - tube_r)
t.setheading(60)
t.circle(2 * tube_r, 60)
}
// 4 sides
if (left && up && right && down) {
t.jump(cx - tube_r, y0 + seam_r)
t.goto(cx - tube_r, cy - tube_r)
t.goto(x0 + seam_r, cy - tube_r)
t.jump(cx - tube_r, y1 - seam_r)
t.goto(cx - tube_r, cy + tube_r)
t.goto(x0 + seam_r, cy + tube_r)
t.jump(cx + tube_r, y0 + seam_r)
t.goto(cx + tube_r, cy - tube_r)
t.goto(x1 - seam_r, cy - tube_r)
t.jump(cx + tube_r, y1 - seam_r)
t.goto(cx + tube_r, cy + tube_r)
t.goto(x1 - seam_r, cy + tube_r)
if (random_bool()) {
t.jump(cx - tube_r, cy - tube_r)
t.setheading(60)
t.circle(2 * tube_r, 60)
t.jump(cx + tube_r, cy + tube_r)
t.setheading(-120)
t.circle(2 * tube_r, 60)
}
else {
t.jump(cx - tube_r, cy + tube_r)
t.setheading(-30)
t.circle(2 * tube_r, 60)
t.jump(cx + tube_r, cy - tube_r)
t.setheading(150)
t.circle(2 * tube_r, 60)
}
}
}
function random_bool() {
return (Math.random() < 0.5)
}
let prev_down = []
for (let i = 0; i < SIZE; i++) {
prev_down[i] = random_bool()
}
let prev_right = random_bool()
for (let y = 0; y < SIZE; y++) {
for (let x = 0; x < SIZE; x++) {
let new_down = random_bool()
let new_right = random_bool()
draw_tile(x, y, prev_right, prev_down[x], new_right, new_down)
prev_right = new_right
prev_down[x] = new_down
}
}