Отрисовка особого круга на канвасе
Имеется круг на канвасе
var canvas = document.getElementById("canvas");
ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.arc(500,300, 250, 0, 2 * Math.PI, false);
ctx.stroke();
Также есть ползунок под этим кругом
<input type="range" min="0" max="30" step="1" id="range">
Задача вообще нетривиальная, но нужна для одного прикольного математического фокуса. Необходимо, чтобы по дефолту на круге стояло 10 точек, от 0 до 9, на равном расстоянии. При изменении ползунка должны добавляться точки, то есть в положении ползунка 0 точек 10, в положении 1 11 итд, при этом разумеется точки должны раздвигаться, чтобы между ними было все время равное расстояние, и еще подписи возле каждой точки. Данная схема реализуема на канвасе, или нужна какая-то другая магия? :D
Ответы (1 шт):
Автор решения: Leonid
→ Ссылка
Можно просто вращать круг и расставлять точки)).
let canvas = document.getElementById('canvas');
window.onresize = render;
function render(){
let ctx = canvas.getContext('2d');
let w = canvas.width = window.innerWidth - 10;
let h = canvas.height = window.innerHeight - 20;
let x = w/2;
let y = h/2;
let radius = Math.min(w/2, h/2) - 25;
let inp = document.getElementById('inp');
inp.style.width = `${w - 10}px`;
inp.oninput = () => {
ctx.clearRect(0,0,w,h);
ctx.beginPath();
ctx.arc(x, y, radius, 0, Math.PI*2);
ctx.stroke();
let num = inp.value;
let angle = Math.PI*2/num;
ctx.save();
ctx.translate(x, y);
ctx.font = '12px serif';
ctx.textAlign = 'center';
for(let i=0; i < num; i++){
ctx.beginPath();
ctx.arc(0, -radius, 3, 0, Math.PI*2);
ctx.fill();
ctx.fillText(`${i}`, 0, - (radius + 6), 12);
ctx.rotate(angle);
}
ctx.restore();
}
inp.dispatchEvent(new Event('input'));
}
render();
canvas {
position: fixed;
top: 20px;
left: 5px;
}
input {
position: fixed;
top: 0px;
left: 5px;
z-index: 1;
outline: none;
}
<input type="range" value="10" id="inp" min="0" max="30">
<canvas id="canvas"></canvas>