円盤ルーレット

by s_yoshiki

HTML

<canvas id="canvas"></canvas>
<br>
<button id="run">run</button>
<button id="stop">stop</button>

<div id="debug"></div>

<div id="labels"></div>

CSS

body {
    background-color: #fafafa;
}

canvas {
    /*width:1000px;
  height:1000px; */
    background-color: #fff;
}

JavaScript

const canvas = document.getElementById("canvas")
const context = canvas.getContext('2d');

var center = {
    x: 150,
    y: 150
}

var radius = 100

var data = [{
        name: "label1",
        color: '#FFCEBE',
        weight: 1
    },
    {
        name: "label2",
        color: '#CEFFBE',
        weight: 1
    },
    {
        name: "label3",
        color: '#CEBEFF',
        weight: 1
    },
    {
        name: "label4",
        color: '#FDED9E',
        weight: 1
    }
]

var sum_weight = 0
var unit_weight = 0
var stopFlag = false;
var startFlag = false;

//
// メイン処理
//
data.forEach(e => {
    sum_weight += e.weight
})
unit_weight = 360 / sum_weight

init()

showLabel()

drawRoullet(0)



function drawRoullet(offset) {
    var uw_count = offset

    data.forEach(e => {
        drawPie(center.x, center.y, uw_count, uw_count + unit_weight, radius, e.color)
        uw_count += unit_weight
    })
}


function runRoullet() {
    var count = 1; //終了までのカウント
    var lastCell = "";
    var deg_counter = 0 // 角度のカウント
    var acceleration = 1

    var timer = setInterval(function() {

        deg_counter += acceleration

        if (stopFlag) {
            count++;
        }

        if (count < 1000) {
            acceleration = 1000 / (count)
            drawRoullet(deg_counter);
        } else {
            count = 0;
            clearInterval(timer);
            endEvent();
        }
    }, 10);

    var endEvent = function() {
        count++;
        var id = setTimeout(endEvent, 115);
        if (count > 9) {
            clearTimeout(id);
            startFlag = false;
            stopFlag = false;
            var current_deg = 360 - Math.ceil((deg_counter - 90) % 360)
            var sum = 0
            var _i = 0
            for (var i = 0; i < data.length; i++) {
                if (unit_weight * sum < current_deg && current_deg < unit_weight * (sum + data[i].weight)) {
                    document.getElementById("debug").innerHTML = data[i].name
          ...