Analogue vs Digital Time
Log in to post a comment.
// To help teaching how to read an analogue clock
// Forked from "Adjustable clock" by Jurgen
// https://turtletoy.net/turtle/9c97e84cd5
// Forked from "Digital Clock" by maraz
// https://turtletoy.net/turtle/c8cda63d7b
// You can find the Turtle API reference here: https://turtletoy.net/syntax
const digitHeight = 40; // //min=10 max=80 step=1
const digitWeight = 3; ////min=1 max=10 step=1
const digital = 1;//min=0 max=1 step=1 (No, Yes)
const analogue = 1;//min=0 max=1 step=1 (No, Yes)
// set the time manually
const hours = 5; //min=0 max=12 step=1
const minutes = 0; //min=0 max=59 step=1
const digitSpacing = 1 * 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;
let yOffset = -25; // // min=-40 max=40 step=1
let time = -1;
let radius = 60; // //min=30, max=100, step=10
let border = 1.5; // //min=1, max=10, step = 3
var borderStep = .1;
Canvas.setpenopacity(1);
function Vec2(x, y) {
this.x = x;
this.y = y;
}
Vec2.prototype.getHeading = function() {
var dot = this.dot( {x: 1, y: 0} );
var rads = Math.acos(dot / this.length());
if( this.y < 0 ) {
rads = (2 * Math.PI) - rads;
}
return rads * 180 / Math.PI;
}
Vec2.prototype.dot = function(vec) {
return (this.x * vec.x) + (this.y * vec.y);
}
Vec2.prototype.toString = function() {
return '[' + this.x + ', ' + this.y + ']';
}
Vec2.prototype.subtract = function(vec) {
return new Vec2(this.x - vec.x, this.y - vec.y);
}
Vec2.prototype.length = function() {
return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2));
}
function drawLine(from, to, width) {
var direction = to.subtract(from);
turtle.jump(from.x, from.y + yOffset);
turtle.setheading(direction.getHeading());
turtle.left(90);
turtle.penup();
turtle.forward(width / 2);
turtle.right(90);
var l = direction.length();
for(var i = 0; i < width; i = i + borderStep) {
if(analogue == 1){
turtle.pendown();
}
turtle.forward(l);
turtle.penup();
turtle.backward(l);
turtle.right(90);
turtle.forward(borderStep);
turtle.left(90);
}
}
// Global code will be evaluated once.
const turtle = new Turtle();
//clock border
for(var i = 0; i < border; i = i + borderStep) {
turtle.jump(radius - i, yOffset);
turtle.setheading(270);
if(analogue ==1){
turtle.circle(-(radius - i));
}
}
//clock face
var j = 0;
for(var i = 0; i < 2 * Math.PI; i = i + Math.PI / 6) {
var length = (j % 3 == 0? .7: .8)
var width = (j % 3 == 0? border: border / 3)
drawLine(
new Vec2(Math.cos(i) * (radius * length), Math.sin(i) * (radius * length))
,new Vec2(Math.cos(i) * (radius * .9), Math.sin(i) * (radius * .9))
,width
)
j++;
}
//clock hour dial
var hour = (time == -1)? hours + (minutes / 60): time / 3600;
drawLine(
new Vec2(
(radius * .1) * Math.sin(((hour+6) * 2 * Math.PI) / 12)
,(radius * .1) * -Math.cos(((hour+6) * 2 * Math.PI) / 12)
)
,new Vec2(
(radius * .5) * Math.sin((hour * 2 * Math.PI) / 12)
,(radius * .5) * -Math.cos((hour * 2 * Math.PI) / 12)
)
,border
);
//clock minute dial
var minute = (time == -1)? minutes: (time - (Math.floor(hour) * 3600)) / 60;
drawLine(
new Vec2(
(radius * .2) * Math.sin(((minute+30) * 2 * Math.PI) / 60)
,(radius * .2) * -Math.cos(((minute+30) * 2 * Math.PI) / 60)
)
,new Vec2(
(radius * .9) * Math.sin((minute * 2 * Math.PI) / 60)
,(radius * .9) * -Math.cos((minute * 2 * Math.PI) / 60)
)
,border
);
if(time > -1) {
//clock seconds dial
var second = time % 60;
drawLine(
new Vec2(
(radius * .3) * Math.sin(((second+30) * 2 * Math.PI) / 60)
,(radius * .3) * -Math.cos(((second+30) * 2 * Math.PI) / 60)
)
,new Vec2(
(radius * .9) * Math.sin((second * 2 * Math.PI) / 60)
,(radius * .9) * -Math.cos((second * 2 * Math.PI) / 60)
)
,border / 4
);
}
// start of digital time code
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() {
// get the current time
// 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.setheading(0)
turtle.goto(-2*digitWidth, -digitHeight*0.5+halfWeight + 70);
function walk(i) {
if(digital == 1){
turtle.drawCurrentTime();
}
return false;
}