円盤ルーレット
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
...