Une horloge hexagonale

Code final

Le code final est :

// On récupère le canvas et son contexte 2D
var canvas = document.querySelector("canvas");
var ctx = canvas.getContext("2d");

// On règle le style du texte
ctx.fillStyle = '#000';
ctx.font = '18px sans-serif';

// On rajoute les textes
ctx.fillText('Hours', 38, 90);
ctx.fillText('Minutes', 173, 90);
ctx.fillText('Seconds', 308, 90);

// Fonction executée toutes les secondes
setInterval(function(){
	ctx.clearRect(0, 0, 410, 75); // efface seulement nos digits

	var now = new Date(); // on récupère la date

	drawPart(35, 35, 95, 35, 30, 20, 15, now.getHours()); // on dessine les heures

	drawPart(175, 35, 235, 35, 30, 20, 15, now.getMinutes()); // on dessine les minutes

	drawPart(315, 35, 375, 35, 30, 20, 15, now.getSeconds()); // on dessine les secondes
}, 1000);

function drawPart(decX, decY, unitX, unitY, outerRadius, innerRadius, singleRadius, partValue) {
	var octValue = partValue.toString(8);

	var octUnit = octValue % 10;
	var octDec =  Math.floor(octValue / 10);

	innerHex(decX, decY, singleRadius, octDec);
	outerHex(decX, decY, innerRadius, outerRadius, octDec);

	innerHex(unitX, unitY, singleRadius, octUnit);
	outerHex(unitX, unitY, innerRadius, outerRadius, octUnit);
}

function outerHex(cx,cy,r1,r2,value) {
  var PI2 = Math.PI*2;
  var rotationAdjustment = -90 * Math.PI/180;
  var sidecount = 6;
  
  for (var i = 0; i < sidecount; i++) {
    var startAngle = PI2/sidecount*i+rotationAdjustment;
    var endAngle = PI2/sidecount*(i+1)+rotationAdjustment;
    
    var cos0 = Math.cos(startAngle);
    var sin0 = Math.sin(startAngle);
    var cos1 = Math.cos(endAngle);
    var sin1 = Math.sin(endAngle);
    
    ctx.beginPath();
    ctx.moveTo(cx+r1*cos0, cy+r1*sin0);
    ctx.lineTo(cx+r2*cos0, cy+r2*sin0);
    ctx.lineTo(cx+r2*cos1, cy+r2*sin1);
    ctx.lineTo(cx+r1*cos1, cy+r1*sin1);
    ctx.closePath();
    
    if(value >= (i + 1)) {
    	ctx.fillStyle = '#000';
    } else {
    	ctx.fillStyle = '#d4d4d4';
	}
    
    ctx.fill();
  }
}

function innerHex(cx, cy, radius, value) {
  var startAngle = -90;
  var edges = 6;
  var angle = 360/edges;
  
  ctx.beginPath();
  
  for (var i = 0; i <= edges; i++) {
    var a = ((angle*i)+startAngle)*(Math.PI/180);
    var x = cx + radius * Math.cos(a);
    var y = cy + radius * Math.sin(a);
    ctx.lineTo(x, y);
  }
  
  if(value == 7) {
    ctx.fillStyle = '#000'
  } else {
    ctx.fillStyle = '#d4d4d4';
  }

  ctx.fill();
}

Une démo fonctionnelle est disponible ici.

Laisser un commentaire