March Madness 3.2: Analog Clock
Uncategorized
Add comments
Mar 032010
Here’s a quick analog clock using the HTML5 canvas tag. Oh canvas tag, how I love thee. Click “Read more” for the source. The formatting is a little wonky because I adjusted to fit in the blog. Oh and you can find all my March Madness programs at this page.
JPLT.Class.create("JPLT.Clock",JPLT.Object, function() { this.width = 500; this.height= 500; this.createElement(); this.appendElement(); this.paint(); this.timer = window.setInterval(this.delegate(this.paint),50); }, { context: function() { return this.element.getContext("2d"); }, createElement: function() { this.element = document.createElement("canvas"); this.element.width = this.width; this.element.height = this.height; this.element.style.border = "1px solid #ccc"; return this.element; }, appendElement: function() { var body = document.documentElement || document.body; body.appendChild(this.element); }, clear: function() { var ctx = this.context(); ctx.clearRect(0,0,this.width,this.height); }, paintBackground: function() { var ctx = this.context(); // Save our translate/rotate state because we're going to make a mess of it. ctx.save(); // Set the origin to be the center of the canvas ctx.translate(this.width/2, this.height/2); ctx.fillStyle = "black"; for (var i=0; i<12; i++) { // We're just going to keep drawing the 3 o'clock line (horizontal) and rotating ctx.beginPath(); ctx.moveTo(this.width/2-35, -5); ctx.lineTo(this.width/2-5, -5); ctx.lineTo(this.width/2-5, 5); ctx.lineTo(this.width/2-35, 5); ctx.lineTo(this.width/2-35, -5); ctx.fill(); ctx.rotate(Math.PI/6); } // Set everything back to normal ctx.restore(); }, // Paints a hand of the clock. // Ratio is the amount around the clock. // Size is the size of the hand. paintHand: function(ratio, size) { var ctx = this.context(); // Same approach as before. Save, rotate, draw horizontally. ctx.save(); ctx.translate(this.width/2, this.height/2); ctx.fillStyle = "black"; // Rotate adjusting for 0 radians being 3 o'clock. ctx.rotate(ratio * (2*Math.PI) - (Math.PI/2)); // Since our origin is now the middle we're working from 0,0 ctx.beginPath(); ctx.moveTo(0, -size/2); ctx.lineTo(this.width/2-size*3, 0); ctx.lineTo(0, size/2); ctx.lineTo(size, 0); ctx.lineTo(0, -size/2); ctx.fill(); ctx.restore(); }, paint: function() { var d = new Date(); var h = d.getHours(); var m = d.getMinutes(); var s = d.getSeconds(); var ms = d.getMilliseconds(); if (h>12) { h -= 12; } this.clear(); this.paintBackground(); this.paintHand((h*3600+m*60+s)/43200,20); this.paintHand((m*60+s)/3600,10); this.paintHand((s*1000+ms)/60000,5); } } ); |

