Digital Clock

Guaranteed to be correct twice a day.

Log in to post a comment.

Canvas.setpenopacity(1);

const digitHeight = 40;
const digitWeight = 4;
const digitSpacing = 2*digitWeight;

const halfWeight = digitWeight/2;
const step = 0.05;
const segmentLength = (digitHeight-digitWeight-4*halfWeight)/2;
const digitWidth = 4*halfWeight + segmentLength + digitSpacing;
const semicolonWidth = 2*halfWeight+2*digitWeight;

Turtle.prototype.drawSegment = function() {
    this.pendown();
    for (let i = 0; i <= segmentLength; i+= step) {
        const left = this.clone();
        const right = this.clone();
        const angle = i < segmentLength/2 ? 45 : 135;
        left.left(angle);
        left.forward(halfWeight);
        right.right(angle);
        right.forward(halfWeight);
        this.forward(step);
    }
    this.penup();
}

Turtle.prototype.skipSegment = function() {
    this.penup();
    this.forward(segmentLength);
}

Turtle.prototype.drawDigit = function(d) {
    const x = this.x();
    const y = this.y();
    d = parseInt(d);
    this.penup();
    this.forward(halfWeight);
    ([0, 2, 3, 5, 6, 7, 8, 9].indexOf(d)!==-1) ? this.drawSegment() : this.skipSegment();
    this.forward(halfWeight);
    this.right(90);
    this.forward(halfWeight);
    ([0, 1, 2, 3, 4, 7, 8, 9].indexOf(d)!==-1) ? this.drawSegment() : this.skipSegment();
    this.forward(halfWeight);
    this.forward(halfWeight);
    ([0, 1, 3, 4, 5, 6, 7, 8, 9].indexOf(d)!==-1) ? this.drawSegment() : this.skipSegment();
    this.forward(halfWeight);
    this.right(90);
    this.forward(halfWeight);
    ([0, 2, 3, 5, 6, 8, 9].indexOf(d)!==-1) ? this.drawSegment() : this.skipSegment();
    this.forward(halfWeight);
    this.right(90);
    this.forward(halfWeight);
    ([0, 2, 6, 8].indexOf(d)!==-1) ? this.drawSegment() : this.skipSegment();
    this.forward(halfWeight);
    this.forward(halfWeight);
    ([0, 4, 5, 6, 8, 9].indexOf(d)!==-1) ? this.drawSegment() : this.skipSegment();
    this.backward(segmentLength+halfWeight);
    this.right(90);
    this.forward(halfWeight);
    ([2, 3, 4, 5, 6, 8, 9].indexOf(d)!==-1) ? this.drawSegment() : this.skipSegment();
    this.goto(x, y);
    this.forward(digitWidth);
}

Turtle.prototype.drawSemicolon = function() {
    const x = this.x();
    const y = this.y();
    const h = this.h();
    this.penup();
    this.forward(2*halfWeight);
    this.right(90);
    this.forward(segmentLength);
    for (let i = 0; i < halfWeight; i+=step) {
        this.pendown();
        this.circle(halfWeight-i);
        this.penup();
        this.right(90);
        this.forward(step/2);
        this.left(90);
    }
    this.left(90);
    this.forward(halfWeight/2);
    this.right(90);
    this.forward(segmentLength*0.75);
    for (let i = 0; i < halfWeight; i+=step) {
        this.pendown();
        this.circle(halfWeight-i);
        this.penup();
        this.right(90);
        this.forward(step/2);
        this.left(90);
    }
    this.goto(x, y);
    this.seth(h);
    this.forward(semicolonWidth);
}

Turtle.prototype.drawCurrentTime = function() {
    const now = new Date();
    const hours = now.getHours();
    const minutes = now.getMinutes();
    const hs = hours < 10 ? "0" + hours : "" + hours;
    const ms = minutes < 10 ? "0" + minutes : "" + minutes;
    hs.split('').map(d => this.drawDigit(d));
    this.drawSemicolon();
    ms.split('').map(d => this.drawDigit(d));
}

const turtle = new Turtle();
turtle.penup();
turtle.goto(-2*digitWidth, -digitHeight*0.5+halfWeight);
turtle.pendown();

function walk(i) {
    turtle.drawCurrentTime();
    return false;
}