diagonal billiard dash line on WxH grid -> two colours (iff W/H coprime)
Log in to post a comment.
Canvas.setpenopacity(-1); const t = new Turtle(); const W = 87; // min=1, max=100, step=1 const H = 100; // min=1, max=100, step=1 const hatch_per_cell = 4; // min=1, max=10, step=1 let s = 200 / Math.max(W, H) if (W > H) { x0 = -100 y0 = -s * H/2 } else { x0 = -s * W/2 y0 = -100 } const cells = [] for (let i = 0; i < W; i++) { cells[i] = [] for (let j = 0; j < H; j ++) { cells[i][j] = false } } let x = 0, y = 0 let dx = +1, dy = +1 let mark = true while (true) { cells[x][y] = mark mark = !mark let left = (x == 0) && (dx == -1) let right = (x == W - 1) && (dx == +1) let down = (y == 0) && (dy == -1) let up = (y == H - 1) && (dy == +1) if ((left || right) && (down || up)) { break } else if (left || right) { dx = -dx y += dy } else if (down || up) { dy = -dy x += dx } else { x += dx y += dy } } t.jump(x0, y0) t.goto(-x0, y0) t.goto(-x0, -y0) t.goto(x0, -y0) t.goto(x0, y0) for (let i = 0; i < W; i++) { for (let j = 0; j < H; j++) { if (cells[i][j]) { if ((i + j) % 2 == 0) { t.jump(x0 + i * s, y0 + j * s) t.goto(x0 + (i + 1) * s, y0 + (j + 1) * s) } else { t.jump(x0 + (i + 1) * s, y0 + j * s) t.goto(x0 + i * s, y0 + (j + 1) * s) } } } } function gcd(x, y) { while (y > 0) { [x, y] = [y, x % y] } return x } if (gcd(W, H) == 1) { mark_u_0 = true mark_d_0 = true for (let j = 0; j < H; j++) { mark_u_0 = mark_d_0 mark_d_0 = cells[0][j] ? !mark_u_0 : mark_u_0 mark_u = mark_u_0 mark_d = mark_d_0 for (let i = 0; i < W; i++) { if (i > 0) { if ((i + j) % 2 == 0) { mark_u = cells[i][j] ? !mark_d : mark_d } else { mark_d = cells[i][j] ? !mark_u : mark_u } } if (mark_u && mark_d) { for (let k = 0; k < hatch_per_cell; k++) { let y = y0 + j * s + s / hatch_per_cell * k t.jump(x0 + i * s, y) t.goto(x0 + (i + 1) * s, y) } } else { if (mark_u) { if ((i + j) % 2 == 0) { for (let k = 0; k < hatch_per_cell; k++) { let ds = s / hatch_per_cell * k let y = y0 + j * s + ds t.jump(x0 + i * s + ds, y) t.goto(x0 + (i + 1) * s, y) } } else { for (let k = 0; k < hatch_per_cell; k++) { let ds = s / hatch_per_cell * k let y = y0 + j * s + ds t.jump(x0 + i * s, y) t.goto(x0 + (i + 1) * s - ds, y) } } } if (mark_d) { if ((i + j) % 2 == 0) { for (let k = 0; k < hatch_per_cell; k++) { let ds = s / hatch_per_cell * k let y = y0 + j * s + ds t.jump(x0 + i * s, y) t.goto(x0 + i * s + ds, y) } } else { for (let k = 0; k < hatch_per_cell; k++) { let ds = s / hatch_per_cell * k let y = y0 + j * s + ds t.jump(x0 + (i + 1) * s - ds, y) t.goto(x0 + (i + 1) * s, y) } } } } } } }