スキップしてメイン コンテンツに移動

JavaScript でアナログ時計を作る p5.js & Canvas

JavaScript でアナログ時計を作ってみました。


前回のデジタル時計の続きです。

▼ p5.js 版

まずは、p5.js バージョンです。

↓p5js_analog-clock.js

let angleSecond, angleMinute, angleHour;
let jikoku_hour, jikoku_minute, jikoku_second;
let posX, posY;
let cX, cY;
let secondWidth, minuteWidth, hourWidth;
function setup() {
createCanvas(600, 400, P2D);
frameRate(60);
angleSecond = 0;
angleMinute = 0;
angleHour = 0;
}
function draw() {
background(200, 100);
jikoku_hour = hour();
jikoku_minute = minute();
jikoku_second = second();
// center
cX = width / 2;
cY = height / 2;
// second
angleSecond = jikoku_second * 6 - 90;
secondWidth = 200;
line(
cX,
cY,
cX + cos(radians(angleSecond)) * secondWidth,
cY + sin(radians(angleSecond)) * secondWidth
);
// minute
angleMinute = jikoku_minute * 6 - 90;
minuteWidth = 150;
line(
cX,
cY,
cX + cos(radians(angleMinute)) * minuteWidth,
cY + sin(radians(angleMinute)) * minuteWidth
);
// hour
if (jikoku_hour > 12) {
angleHour = (jikoku_hour - 12) * 30 - 90;
} else {
angleHour = jikoku_hour * 30 - 90;
}
hourWidth = 100;
line(
cX,
cY,
cX + cos(radians(angleHour)) * hourWidth,
cY + sin(radians(angleHour)) * hourWidth
);
}

簡単にできると思いましたが、時間とか時計は奥が深そうですね。

▼ canvas 版

次は、Canvas バージョンです。

ちょっと冗長な気もするけど、確実にできそうな方法を選択しました。

↓canvas_analog-clock.js

(() => {
let canvas = null;
let ctx = null;
window.addEventListener(
'load',
() => {
initialize();
render();
},
false
);
function initialize() {
canvas = document.getElementById('canvas');
canvas.width = 600;
canvas.height = 400;
ctx = canvas.getContext('2d');
}
function render() {
ctx.fillStyle = 'gray';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// date
let dt = new Date();
console.log(dt);
// center
let cx = canvas.width / 2;
let cy = canvas.height / 2;
// -------- second ----------------
let secondWidth = 200;
let secondAngle = dt.getSeconds();
console.log(secondAngle);
let secondDegrees = secondAngle * 6 - 90;
let secondRadians = (Math.PI / 180) * secondDegrees;
// second line
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.lineTo(
cx + Math.cos(secondRadians) * secondWidth,
cy + Math.sin(secondRadians) * secondWidth
);
ctx.stroke();
// -------- minute ----------------
let minuteWidth = 150;
let minuteAngle = dt.getMinutes();
console.log(minuteAngle);
let minuteDegrees = minuteAngle * 6 - 90;
let minuteRadians = (Math.PI / 180) * minuteDegrees;
// minute line
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.lineTo(
cx + Math.cos(minuteRadians) * minuteWidth,
cy + Math.sin(minuteRadians) * minuteWidth
);
ctx.stroke();
// -------- hour ----------------
let hourWidth = 100;
let hourAngle = dt.getHours();
console.log(hourAngle);
let hourDegrees = hourAngle * 30 - 90;
let hourRadians = (Math.PI / 180) * hourDegrees;
// hour line
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.lineTo(
cx + Math.cos(hourRadians) * hourWidth,
cy + Math.sin(hourRadians) * hourWidth
);
ctx.stroke();
// animation
window.requestAnimationFrame(render);
}
})();

classとか使ったら、もっと単純になりそうです。

このブログの人気の投稿

TouchDesigerでmp4を書き出す(映像+音)

TouchDesignerの醍醐味は音と図形を連動できることだと思ってます。 私がTouchDesignerに惹かれたのは、この部分です。 ということで、音と図形の連動をやってみました。 こんな動画をつくりました。 ▼ 動画作成手順 まず、TouchDesignerで動画を作成します。 以下の手順で作成します。 ▼ ムービー ・[Circle TOP]で円をつくる ・[Transform CHOP]をつなげる ▼ サウンド ・[Audio File In]で音を取り込む(デフォルトの音を選んでます) ・[Audio Filter CHOP]の[Filter]で[Band Pass]を選択 ・[Math CHOP]の[Combine Channels]の[Maxinum]を選択 ・[Math CHOP]の[Range]の[To Range]を 0 ~ 100 にする ・[Null CHOP]をつなげる ▼ サウンドをスケールに反映する ・サウンドの[Null CHOP]をムービーの[Transform TOP]の Scale へつなげる ▼ 大きさを調整する ・背景用に[Constant CHOP]をつくる ・[Over TOP]をつくる ・[Over TOP]に[Transform TOP]と[Constant CHOP]をつなげる ・[Over TOP]の[Fixed Layer]を[Constant CHOP]に合わせる(この場合は Input2) 完成です。 ▼ mp4書き出し手順 これを書き出します。 ・[File]メニューから[Export Movie]を選択 ・サウンドの[Null CHOP]を[CHOP Audio]へドラッグ・アンド・ドロップ ・ムービーの[Null TOP]を[TOP Video]へドラッグ・アンド・ドロップ ・[Codec]の[MPEG4]を選択 ・[Filename]で保存先を選択 ・Render Movieの[Start]をクリック こんな感じです↓ これでMpeg4のファイルができていると思います。

BlenderデータをTouchDesignerに取り込みたい

Blenderで作ったものをTouchDesignerで扱いたいと思いました。 しかし、いろいろ調べたのですが、方法が見つからなくて苦労しました。 基本的すぎて誰も記事や動画にしないのかもしれません。。 参考にした動画 TDSW Youtube Academyを参考にしました。 無事に完了して、以下の画像のようになりました。 手順 Blenderで作ったものをTouchDesignerで扱うための方法は以下の手順です。 1.Blenderで作ったものを「obj」形式でエクスポート 2.objファイルをTouchDesignerにドラッグ・アンド・ドロップする 3.配置したSOPの右側を右クリックしてGeometoryCOMPを置く 4.CameraCOMPを置く 5.LightCOMPを置く 6.renderTOPを置く。自動的にGeometoryCOMP、CamaraCOMP、LightCOMPとつながる。 これでBlenderで作ったものをTouchDesignerで扱えるようになります。 ちなみに 3Dを扱うときの画面分割方法は、 ・左にいつもの作業画面 ・右上にGeometory Viewer ・右下にTop Viewer を置くといいようです。 右下は、Top Viewerを選択した後、OutTOPのDisplayをオンにすると表示されます。

TouchDesignerで画像と文字を書き出したい

TouchDesignerを勉強しています。 基本的なことはざっくりとやってみました。 今回は画像と文字を書き出したいと思います。 動画を書き出す TouchDesignerは動画がメインだと思うのですが、単純に画像を書き出すことってどうするんだろう?と思ったので、やってみました。 [Movie File in]で画像を読み込む [Level]で少し調整 画像と背景の[Constant]を[Over]で合わせる [Text]で文字を入れる [Over]でテキストと画像を合わせる [Null]で右クリックしてsave imageする Nullで画像を保存するとtiff形式になりました。 他にも書き出し方がありそうですがわからなかったので、今回はGIMPでpngにしました。 TouchDesignerって便利ですね。 動画も画像も音声もなんでもかんでもTouchDesignerでまとめることができそうです。