JavaScriptのsinとcosを使ってみる

JavaScriptのsinとcosを使って、円周上を移動する処理を記述してみます。

サンプルコード

以下のようなコードで、.circleを円周上に移動させてみます。

<div class="box">
  <div class="circle"></div>
</div>

.circleのtopとleftを変更させる想定でCSSを設定します。

.circle {
  position: absolute;
  background: red;
}

最後にJavaScriptです。

const rotate = (ts) => {
  const count = ts / 1000;
  // 円周上のX座標とY座標を取得
  const xPos = 100 * Math.sin(count);
  const yPos = 100 * Math.cos(count);
  console.log(count, xPos, yPos);
  document.querySelector('.circle').style.left = `${xPos}px`;
  document.querySelector('.circle').style.top = `${yPos}px`;

  window.requestAnimationFrame(rotate);
}
window.requestAnimationFrame(rotate);

円の中心が(0, 0)で半径がrの円周上の座標(x, y)は、x = r × sinθ、y = r × cosθの数式で求められます。
上記のコードでいうと4~5行目で、半径rが100の円周上の座標を取得していることになります。

これで.circleが円周上を移動するようになりました。
円周上を移動するデモページ

上記の例だと円周の最下部からスタートしていますが、開始地点を変える場合は以下のようにします。

const rotate = (ts) => {
  const count = ts / 1000;
  // 円周上のX座標とY座標を取得
  const xPos = 100 * Math.sin(count + Math.PI);
  const yPos = 100 * Math.cos(count + Math.PI);
  console.log(count, xPos, yPos);
  document.querySelector('.circle').style.left = `${xPos}px`;
  document.querySelector('.circle').style.top = `${yPos}px`;

  window.requestAnimationFrame(rotate);
}
window.requestAnimationFrame(rotate);

これで円周の最上部からスタートするようになりました。
円周上を移動するデモページ2
同じように、円周の右端から開始する場合は「(Math.PI * 0.5)」、左は時から開始する場合は「(Math.PI * 1.5)」のようにすると変更できます。

円の中心位置をずらしたい場合、以下のように変更します。

const rotate = (ts) => {
  const count = ts / 1000;
  // 円周上のX座標とY座標を取得
  const xPos = 100 * Math.sin(count) + 50;
  const yPos = 100 * Math.cos(count) + 50;
  console.log(count, xPos, yPos);
  document.querySelector('.circle').style.left = `${xPos}px`;
  document.querySelector('.circle').style.top = `${yPos}px`;

  window.requestAnimationFrame(rotate);
}
window.requestAnimationFrame(rotate);

この場合、円の中心が右に50px、下に50px移動しました。
円周上を移動するデモページ3

参考サイト

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2025年5月
 123
45678910
11121314151617
18192021222324
25262728293031