const on = (el, ev, fn) => el.addEventListener(ev, fn, { passive: true }); const $ = (selector, el) => (el || document).querySelector(selector); on(document, 'DOMContentLoaded', () => { const canvas = $('#my-canvas'); const context = canvas.getContext('2d'); const half_width = canvas.width / 2; const half_height = canvas.height / 2; const clock_radius = Math.min(half_width, half_height) * 0.85; function drawLine(x1, y1, x2, y2) { context.beginPath(); context.moveTo(x1 + half_width, y1 + half_height); context.lineTo(x2 + half_width, y2 + half_height); context.stroke(); }; function putText(x, y, text) { context.font = "18px Arial"; context.textAlign = "center"; context.fillText(text, x + half_width, y + half_height); }; function clock() { context.clearRect(0, 0, canvas.width, canvas.height); const count = 12 const pi2 = 2 * Math.PI; for (let r = 0; r < count; r++) { const angle = r * (pi2 / 12); const x = Math.sin(angle) * clock_radius; const y = -Math.cos(angle) * clock_radius; const nextX = Math.sin(angle) * (clock_radius / 1.1); const nextY = -Math.cos(angle) * (clock_radius / 1.1); const textX = Math.sin(angle) * (clock_radius * 1.1); const textY = -Math.cos(angle) * (clock_radius * 1.1); drawLine(x, y, nextX, nextY); putText(textX, textY + 7, (r || 12).toString()); }; const parts = 24 * 10; for (let r = 0; r < parts; r++) { const angle = r * (pi2 / parts); const x = Math.sin(angle) * clock_radius; const y = -Math.cos(angle) * clock_radius; const nextAngle = (r + 1) * pi2 / parts; const nextX = Math.sin(nextAngle) * clock_radius; const nextY = -Math.cos(nextAngle) * clock_radius; drawLine(x, y, nextX, nextY); }; // draw hour/minute lines const now = new Date(); const hoursWithDecimals = now.getHours() + (now.getMinutes() / 60); const minutes = now.getMinutes(); const seconds = now.getSeconds() + (now.getMilliseconds() / 1000); function drawHours() { const angle = hoursWithDecimals * (pi2 / 12) const x = Math.sin(angle) * (clock_radius / 2); const y = -Math.cos(angle) * (clock_radius / 2); drawLine(0, 0, x, y); } function drawMinutes() { const angle = minutes * (pi2 / 60) const x = Math.sin(angle) * (clock_radius / 1.2); const y = -Math.cos(angle) * (clock_radius / 1.2); drawLine(0, 0, x, y); } function drawSeconds() { const angle = seconds * (pi2 / 60) const x = Math.sin(angle) * (clock_radius / 1.05); const y = -Math.cos(angle) * (clock_radius / 1.05); drawLine(0, 0, x, y); } drawHours(); drawMinutes(); drawSeconds(); }; const fps = 10; const fpsInterval = 1000 / fps; let then; function step(now) { window.requestAnimationFrame(step); if (then === undefined) { then = now; } const elapsed = now - then; if (elapsed > fpsInterval) { // Get ready for next frame by setting then=now, but also adjust for your // specified fpsInterval not being a multiple of RAF's interval (16.7ms) then = now - (elapsed % fpsInterval); clock(); } } window.requestAnimationFrame(step); // setInterval(() => clock(), 20); });
617700cookie-checkDraw a clock with sin/cos