“Крутите барабан” или фон на каждый сектор

160
07 февраля 2020, 04:50

Есть барабан, каждый сектор - определенного цвета. Нужно чтоб каждый сектор имел свой background-image. Предоставляю часть JS-а:

var canvas = document.getElementById('canvas');
var windowwidth = window.innerWidth
    var width;
    var height;
    if (windowwidth < 1140) {
        //height = window.innerHeight;
      height = 320;
        width = 320;
    } else {
        width = 500;
        height = 500;
    }
    canvas.style.width = width + 'px';
    canvas.style.height = height + 'px';
};
window.addEventListener('resize', resize, false);
    var options = ["ליבי הסוסה", "היפופוטם", "נחום הינשוף", "החמור יוגב",
  "ליבי הסוסה", "היפופוטם", "נחום הינשוף", "החמור יוגב"
];
var coloroptions = ["#4E63AD", "#9475b0", "#f26722", "#2e9874", "#4E63AD", "#9475b0", "#f26722", "#2e9874"];
 var imgarray = ["https://www.aniboaz.co.il/Blog/libi/wp-content/uploads/sites/4/2016/04/libi_new_2.png" , "https://www.aniboaz.co.il/Blog/libi/wp-content/uploads/sites/4/2016/04/libi_new_2-02.jpg"];
 var linka = ["#"];
var startAngle = 110;
var arc = Math.PI / (options.length / 2);
var spinTimeout = null;
var spinArcStart = 220;
var spinTime = 0;
var spinTimeTotal = 0;
var ctx;
document.getElementById("spin").addEventListener("click", spin);
function byte2Hex(n) {
  var nybHexString = "0123456789ABCDEF";
  return String(nybHexString.substr((n >> 4) & 0x0F, 1)) + nybHexString.substr(n & 0x0F, 1);
}
function RGB2Color(r, g, b) {
  return '#' + byte2Hex(r) + byte2Hex(g) + byte2Hex(b);
}
function drawRouletteWheel() {
  var canvas = document.getElementById("canvas");
  if (canvas.getContext) {
    var outsideRadius = 200;
    var textRadius = 150;
    var insideRadius = 40;
    ctx = canvas.getContext("2d");
    ctx.clearRect(0, 0, 500, 500);
    ctx.strokeStyle = "Teal";
    ctx.lineWidth = 1;
    ctx.font = "bold 18px Rubik, sans-serif";
    for (var i = 0; i < options.length; i++) {
      var angle = startAngle + i * arc;
      //ctx.fillStyle = colors[i] ** getColor(i,options.length) ;
      ctx.fillStyle = coloroptions[i];
      ctx.beginPath();
      ctx.arc(250, 250, outsideRadius, angle, angle + arc, false);
      ctx.arc(250, 250, insideRadius, angle + arc, angle, true);
      ctx.stroke();
      ctx.fill();
      ctx.shadowOffsetX = -10;
      ctx.shadowOffsetY = -10;
      ctx.shadowBlur = 30;
      ctx.shadowColor = "rgba(0,0,0,0.5)";
      ctx.save();
       var imageObj = new Image();
           ctx.fillStyle = "white";
      ctx.translate(250 + Math.cos(angle + arc / 2) * textRadius,        250 + Math.sin(angle + arc / 2) * textRadius);
      ctx.rotate(angle + arc / 2 + Math.PI / 2);
      var text = options[i];            
      ctx.fillText(text, -ctx.measureText(text).width / 2, 0);
      ctx.drawImage(imageObj, 5, 20, 40, 40);
          ctx.restore();          
    }
    //Arrow
    ctx.beginPath();
    ctx.moveTo(250 - 15, 250 - (outsideRadius + 25));
    ctx.lineTo(250 + 15, 250 - (outsideRadius + 25));
    ctx.lineTo(250 + 15, 250 - (outsideRadius - 5));
    ctx.lineTo(250 + 15, 250 - (outsideRadius - 5));
    ctx.lineTo(250 + 0, 250 - (outsideRadius - 13));
    ctx.lineTo(250 - 15, 250 - (outsideRadius - 5));
    ctx.lineTo(250 - 15, 250 - (outsideRadius - 5));
    ctx.lineTo(250 - 15, 250 - (outsideRadius + 15));
    ctx.shadowOffsetX = +10;
    ctx.shadowOffsetY = 22;
    ctx.shadowBlur = 20;
    ctx.shadowColor = "rgba(0,0,0,0.5)";
    ctx.fillStyle = "white";
    ctx.fill();
    ctx.end;
  }
}

ссылка на код: https://codepen.io/CTACON23/pen/dLjzMW

(код не мой)

fillStyle не подходит, drawImage не работает с елементами такого типа

Answer 1

Кликайте несколько раз, чтобы крутить барабан

let canvas = document.querySelector('canvas'); 
let context = canvas.getContext('2d'); 
context.strokeStyle = 'white'; 
context.lineWidth = 5; 
let angle = 0, speed = 0; 
 
let images = [ 
  {url:'https://i.stack.imgur.com/GkUv4.jpg'}, 
  {url:'https://i.stack.imgur.com/gFeUb.png'}, 
  {url:'https://i.stack.imgur.com/gW9Md.png'}, 
  {url:'https://i.stack.imgur.com/GkUv4.jpg'}, 
  {url:'https://i.stack.imgur.com/gFeUb.png'}, 
  {url:'https://i.stack.imgur.com/gW9Md.png'}, 
  {url:'https://i.stack.imgur.com/GkUv4.jpg'}, 
  {url:'https://i.stack.imgur.com/gFeUb.png'}, 
  {url:'https://i.stack.imgur.com/gW9Md.png'} 
]; 
 
load(images); 
 
function load(imgs) { 
  let loading = images.find(i => !i.pattern); 
  if (!loading)  
    return draw(); 
  let img = new Image();     
  img.src = loading.url; 
  img.onload = function() { 
    loading.pattern = context.createPattern(img, 'repeat'); 
    load(imgs); 
  } 
} 
 
addEventListener('click', () => speed += 1 + Math.random()*5) 
 
let k = Math.PI*2/images.length; 
let t = new Date().getTime(); 
   
function draw() { 
  let dt = new Date().getTime() - t; 
  t += dt; 
  angle += speed*dt/1000; 
  speed = speed*0.99; 
   
  context.clearRect(0,0,canvas.width, canvas.height) 
  rotate(angle); 
  images.forEach((img, i) => { 
    context.fillStyle = img.pattern; 
    arc(245,k*i,k*i+k); 
  }) 
  context.fillStyle = 'white'; 
  arc(100,0,Math.PI*2); 
  rotate(-angle); 
  requestAnimationFrame(draw); 
} 
 
function rotate(a) { 
  context.translate(canvas.width/2,canvas.height/2); 
  context.rotate(a) 
  context.translate(-canvas.width/2,-canvas.height/2); 
} 
 
function arc(radius,a1,a2){ 
    context.beginPath(); 
    context.moveTo(canvas.width/2,canvas.height/2); 
    context.arc(canvas.width/2,canvas.height/2,radius,a1,a2); 
    context.closePath(); 
    context.fill(); 
    context.stroke() 
}
<canvas width=500 height=500 style="height:90vh"></canvas>

READ ALSO
HTML страница не выводит кириллицу

HTML страница не выводит кириллицу

после переноса сайта на хостинг перестала выводить кириллицуМесто букв выводит вопросительные знаки

196
Настройка фильтра авторизации mvc

Настройка фильтра авторизации mvc

Хочу настроить фильтр для доступа к админ странице, таким образом:

183
Как изменить свойства форм основного GUI из стороннего класса [закрыт]

Как изменить свойства форм основного GUI из стороннего класса [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

171
Как получить точки контакта из EPA

Как получить точки контакта из EPA

Делаю импульсный(?) физический движок(2D)Для распознавания коллизий решил юзать GJK + EPA

188