Generate a plottable calendar
Log in to post a comment.
const month = 10 // min=0, max=11, step=1 (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
const year = 2021 // min=2020, max=2030, step=1
const first_day = new Date(year, month, 1).getDay()
// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(1);
const rows = 5
const cols = 7
const date_size = 7 // min=3, max=12, step=1
const date_percent = 0.7
// Global code will be evaluated once.
const turtle = new Turtle();
const spacing = Math.min(Math.floor(200 / rows), Math.floor(200 / cols))
const x = (200 - cols * spacing) / 2 - 100
const y = (200 - rows * spacing) / 2 - 100
const seg_len = (date_size * date_percent) / 2
turtle.penup()
function draw_grid() {
turtle.penup()
for (let r = 0; r <= rows; r++) {
turtle.goto(x, y + r * spacing)
turtle.pendown()
turtle.goto(x + cols * spacing, y + r * spacing)
turtle.penup()
}
for (let c = 0; c <= cols; c++) {
turtle.goto(x + c * spacing, y)
turtle.pendown()
turtle.goto(x + c * spacing, y + rows * spacing)
turtle.penup()
}
}
function draw_corner(r, c) {
cy = y + spacing * r
cx = x + spacing * c
turtle.goto(cx, cy)
turtle.seth(0)
turtle.forward(date_size)
turtle.right(90)
turtle.pendown()
turtle.forward(date_size)
turtle.right(90)
turtle.forward(date_size)
turtle.penup()
}
function draw_number(x, y, n, seg_len) {
turtle.penup()
turtle.goto(x, y)
turtle.seth(0)
switch(n) {
case 0:
turtle.pendown()
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len * 2)
turtle.right(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len * 2)
break
case 1:
turtle.forward(seg_len)
turtle.pendown()
turtle.right(90)
turtle.forward(seg_len * 2)
break
case 2:
turtle.pendown()
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len)
turtle.left(90)
turtle.forward(seg_len)
turtle.left(90)
turtle.forward(seg_len)
break
case 3:
turtle.pendown()
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len * 2)
turtle.right(90)
turtle.forward(seg_len)
turtle.penup()
turtle.right(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.pendown()
turtle.forward(seg_len)
break
case 4:
turtle.right(90)
turtle.pendown()
turtle.forward(seg_len)
turtle.left(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len)
turtle.penup()
turtle.backward(seg_len)
turtle.pendown()
turtle.backward(seg_len)
break
case 5:
turtle.forward(seg_len)
turtle.right(180)
turtle.pendown()
turtle.forward(seg_len)
turtle.left(90)
turtle.forward(seg_len)
turtle.left(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len)
break
case 6:
turtle.forward(seg_len)
turtle.right(180)
turtle.pendown()
turtle.forward(seg_len)
turtle.left(90)
turtle.forward(seg_len * 2)
turtle.left(90)
turtle.forward(seg_len)
turtle.left(90)
turtle.forward(seg_len)
turtle.left(90)
turtle.forward(seg_len)
break
case 7:
turtle.pendown()
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len * 2)
break
case 8:
turtle.pendown()
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len * 2)
turtle.right(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len * 2)
turtle.penup()
turtle.backward(seg_len)
turtle.right(90)
turtle.pendown()
turtle.forward(seg_len)
break
case 9:
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.pendown()
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len)
turtle.right(90)
turtle.forward(seg_len * 2)
break
}
turtle.penup()
}
function draw_date(r, c, d) {
const h_offset = date_size * (1 - date_percent) / 3
const v_offset = date_size * (1 - date_percent) / 2
draw_corner(r, c)
cy = y + spacing * r
cx = x + spacing * c
if (d > 9) {
draw_number(cx + h_offset, cy + v_offset, Math.trunc(d / 10), seg_len)
}
draw_number(cx + h_offset * 2 + seg_len, cy + v_offset, d % 10, seg_len)
}
function get_month_dates() {
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
day = r * cols + c
date = new Date(year, month, day - first_day + 1).getDate()
draw_date(r, c, date)
}
}
}
// https://turtletoy.net/turtle/8abd768e03
function drawLetter(let, x, y, size) {
var points = Letter[let];
if (typeof points == 'undefined' || points.length < 1) return;
turtle.penup();
for (var i = 0; i < points.length - 1; i = i+2) {
turtle.goto(x+points[i]*size,y-points[i+1]*size);
if (i == 0) turtle.pendown();
}
}
function drawWord(word, x, y, size) {
word = word.toUpperCase();
for (var i = 0; i < word.length; i++) {
// repeat the letter shifted to darken/shadow
[0,0.2].forEach(function(shift) {
drawLetter(word[i], x+shift, y+shift, size);
});
// letter spacing
if (word[i] == 'I') { x += size-3 } else x += size+1;
}
}
var Letter = new Array();
Letter['A'] = new Array(0,0,0.5,1,0.75,0.5,0.25,0.5,0.75,0.5,1,0);
Letter['B'] = new Array(0,0,0,1,0.625,1,0.75,0.875,0.75,0.625,0.625,0.5,0,0.5,0.625,0.5,0.75,0.375,0.75,0.125,0.625,0,0,0);
Letter['C'] = new Array(0.75,0.125,0.625,0,0.125,0,0,0.125,0,0.875,0.125,1,0.625,1,0.75,0.875);
Letter['D'] = new Array(0,0,0,1,0.625,1,0.75,0.875,0.75,0.125,0.625,0,0,0);
Letter['E'] = new Array(0.75,0,0,0,0,0.5,0.75,0.5,0,0.5,0,1,0.75,1);
Letter['F'] = new Array(0,0,0,0.5,0.75,0.5,0,0.5,0,1,0.75,1);
Letter['G'] = new Array(0.75,0.5,0.625,0.5,0.75,0.5,0.75,0.125,0.625,0,0.125,0,0,0.125,0,0.875,0.125,1,0.625,1,0.75,0.875);
Letter['H'] = new Array(0,0,0,1,0,0.5,0.75,0.5,0.75,1,0.75,0);
Letter['I'] = new Array(0,0,0.25,0,0.125,0,0.125,1,0,1,0.25,1);
Letter['J'] = new Array(0,0.125,0.125,0,0.375,0,0.5,0.125,0.5,1);
Letter['K'] = new Array(0,0,0,1,0,0.5,0.75,1,0,0.5,0.75,0);
Letter['L'] = new Array(0,0,0,1,0,0,0.75,0);
Letter['M'] = new Array(0,0,0,1,0.5,0,1,1,1,0);
Letter['N'] = new Array(0,0,0,1,0.75,0,0.75,1);
Letter['O'] = new Array(0.75,0.125,0.625,0,0.125,0,0,0.125,0,0.875,0.125,1,0.625,1,0.75,0.875,0.75,0.125);
Letter['P'] = new Array(0,0,0,1,0.625,1,0.75,0.875,0.75,0.625,0.625,0.5,0,0.5);
Letter['Q'] = new Array(0.75,0.125,0.625,0,0.125,0,0,0.125,0,0.875,0.125,1,0.625,1,0.75,0.875,0.75,0.125,0.875,0);
Letter['R'] = new Array(0,0,0,1,0.625,1,0.75,0.875,0.75,0.625,0.625,0.5,0,0.5,0.625,0.5,0.875,0);
Letter['S'] = new Array(0,0.125,0.125,0,0.625,0,0.75,0.125,0.75,0.375,0.675,0.5,0.125,0.5,0,0.625,0,0.875,0.125,1,0.625,1,0.75,0.875);
Letter['T'] = new Array(0,1,0.5,1,0.5,0,0.5,1,1,1);
Letter['U'] = new Array(0,1,0,0.125,0.125,0,0.625,0,0.75,0.125,0.75,1);
Letter['V'] = new Array(0,1,0.375,0,0.75,1);
Letter['W'] = new Array(0,1,0.25,0,0.5,1,0.75,0,1,1);
Letter['X'] = new Array(0,0,0.375,0.5,0,1,0.375,0.5,0.75,1,0.375,0.5,0.75,0);
Letter['Y'] = new Array(0,1,0.375,0.5,0.375,0,0.375,0.5,0.75,1);
Letter['Z'] = new Array(0,1,0.75,1,0,0,0.75,0);
Letter[' '] = new Array();
Months = new Array('JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER')
// The walk function will be called until it returns false.
function walk(i) {
draw_grid()
get_month_dates()
edge_offset = 9
drawWord('SUN', x + 0 * spacing + edge_offset, y - 3, 2.5)
drawWord('MON', x + 1 * spacing + edge_offset, y - 3, 2.5)
drawWord('TUE', x + 2 * spacing + edge_offset, y - 3, 2.5)
drawWord('WED', x + 3 * spacing + edge_offset, y - 3, 2.5)
drawWord('THU', x + 4 * spacing + edge_offset, y - 3, 2.5)
drawWord('FRI', x + 5 * spacing + edge_offset, y - 3, 2.5)
drawWord('SAT', x + 6 * spacing + edge_offset, y - 3, 2.5)
drawWord(Months[month], x + 5, y - 10, 5)
draw_number(100 - 25, y - 15, Math.trunc(year / 1000) % 10, 3)
draw_number(100 - 20, y - 15, Math.trunc(year / 100) % 10, 3)
draw_number(100 - 15, y - 15, Math.trunc(year / 10) % 10, 3)
draw_number(100 - 10, y - 15, Math.trunc(year / 1) % 10, 3)
return false;
}