円グラフ作成 ケーキを切る少年たちのゲーム

円グラフ作成 ケーキを切る少年たちのゲーム | ひまあそび-ミニゲーム hi0a.com

view source

JavaScript

document.title = '円グラフ作成 ケーキを切る少年たちのゲーム';

let { canvas, ctx, cx, cy, w, h, min, demo } = readyCanvas();



const radius = min/2 - min/90;

let angles = [0]; // クリックされた角度の記録(開始は0)
const colors = ['#f88','#8f8','#88f','#ff8','#8ff','#f8f','#f44','#4f4','#44f','#ff4','#4ff','#f4f'];

function drawSegments() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  let sortedAngles = [...angles].sort((a, b) => a - b);

  for (let i = 0; i < sortedAngles.length; i++) {
    const rawStart = sortedAngles[i];
    const rawEnd = sortedAngles[i + 1] ?? (2 * Math.PI); // 最後は2πまで描く
    const isLast = (i === sortedAngles.length - 1 && rawEnd === 2 * Math.PI);
    
    const start = rawStart - Math.PI / 2;
    const end = rawEnd - Math.PI / 2;
    const mid = (rawStart + rawEnd) / 2 - Math.PI / 2;

    ctx.beginPath();
    ctx.moveTo(cx, cy);
    ctx.arc(cx, cy, radius, start, end);
    ctx.closePath();

    // 色分け:最後の余りは #888、それ以外は配列から
    ctx.fillStyle = (i === sortedAngles.length - 1) ? "#888" : colors[i % colors.length];
    ctx.fill();

    // 線の描画(最後の終了点に線を描かない)
/*
    ctx.strokeStyle = "black";
    ctx.beginPath();
    ctx.moveTo(cx, cy);
    ctx.lineTo(cx + radius * Math.cos(start), cy + radius * Math.sin(start));
    ctx.stroke();
*/

    // パーセント表示
    if(angles.length < 15){
      const percent = ((rawEnd - rawStart) / (2 * Math.PI) * 100).toFixed(1);
      const labelX = cx + (radius * 3/ 4) * Math.cos(mid);
      const labelY = cy + (radius * 3/ 4) * Math.sin(mid);
      ctx.fillStyle = "black";
      ctx.font = "16px sans-serif";
      ctx.fillText(`${percent}%`, labelX - 15, labelY);
    }
  }
}


canvas.addEventListener("click", function(e) {
  const rect = canvas.getBoundingClientRect();
  const x = e.clientX - rect.left - cx;
  const y = e.clientY - rect.top - cy;

  let angle = Math.atan2(y, x);
  let adjustedAngle = (angle + Math.PI / 2 + 2 * Math.PI) % (2 * Math.PI); // 12時を基準に補正

  if (!angles.some(a => Math.abs(a - adjustedAngle) < 0.01)) {
    angles.push(adjustedAngle);
  }

  drawSegments();
});

canvas.addEventListener("dblclick", function () {
  angles = [0]; // 初期状態にリセット
  drawSegments();
});

// 初期描画
drawSegments();

CSS

HTML

ページのソースを表示 : Ctrl+U , DevTools : F12

view-source:https://hi0a.com/game/canvas-circle-grath/

ABOUT

hi0a.com 「ひまあそび」は無料で遊べるミニゲームや便利ツールを公開しています。

プログラミング言語の動作デモやWEBデザイン、ソースコード、フロントエンド等の開発者のための技術を公開しています。

必要な機能の関数をコピペ利用したり勉強に活用できます。

プログラムの動作サンプル結果は画面上部に出力表示されています。

環境:最新のブラウザ GoogleChrome / Windows / Android / iPhone 等の端末で動作確認しています。

画像素材や音素材は半分自作でフリー素材配布サイトも利用しています。LINK参照。

仕様変更、API廃止等、実験途中で動かないページもあります。