triangulo rectangulo lineas hacer figuras dibujar coordenadas como circulo arco javascript html5 canvas html5-canvas

javascript - rectangulo - ¿Cómo rellenar el arco del círculo de cannvas con una imagen diferente?



dibujar un triangulo en javascript (2)

Tratar

var img=new Image(); img.onload=start; img.src="http://www.flooringvillage.co.uk/ekmps/shops/flooringvillage/images/request-a-sample--547-p.jpg"; function start(){ var pattern=ctx.createPattern(img,''repeat''); ctx.beginPath(); ctx.arc(50,50,15,0,Math.PI*2); ctx.closePath(); ctx.fillStyle=pattern; ctx.fill(); ctx.stroke(); }

Estoy creando un círculo de la rueda de la fortuna usando el lienzo html5. Funciona bien con el color de estilo de relleno. Quiero dos (2) imágenes diferentes en un patrón de estilo de relleno de sectores aleatorios. Cómo lograr eso.

aquí está mi JS

function rand(min, max) { return Math.random() * (max - min) + min; } var color = [''#fbc'',''#f88'',''#fbc'',''#f88'',''#fbc'',''#f88'', "#fbc", "#f67"]; var label = [''10'', ''200'', ''50'', ''100'', ''5'', ''500'', ''0'', "jPOT"]; var slices = color.length; var sliceDeg = 360/slices; var deg = rand(0, 360); var speed = 0; var slowDownRand = 0; var ctx = canvas.getContext(''2d''); var width = canvas.width; // size var center = width/2; // center var isStopped = false; var lock = false; function deg2rad(deg) { return deg * Math.PI/180; } function drawSlice(deg, color) { ctx.beginPath(); ctx.fillStyle = color; ctx.moveTo(center, center); ctx.arc(center, center, width/2, deg2rad(deg), deg2rad(deg+sliceDeg)); ctx.lineTo(center, center); ctx.fill(); } function drawText(deg, text) { ctx.save(); ctx.translate(center, center); ctx.rotate(deg2rad(deg)); ctx.textAlign = "right"; ctx.fillStyle = "#fff"; ctx.font = ''bold 30px sans-serif''; ctx.fillText(text, 130, 10); ctx.restore(); } function drawImg() { ctx.clearRect(0, 0, width, width); for(var i=0; i<slices; i++){ drawSlice(deg, color[i]); drawText(deg+sliceDeg/2, label[i]); deg += sliceDeg; } } document.getElementById("spin").addEventListener("mousedown", function(){ isStopped = true; }, false); drawImg(); document.getElementById("play").addEventListener("mousedown", function(){ (function anim() { deg += speed; deg %= 360; // Increment speed if(!isStopped && speed<3){ speed = speed+1 * 8; } // Decrement Speed if(isStopped){ if(!lock){ lock = true; slowDownRand = rand(0.994, 0.998); } speed = speed>0.2 ? speed*=slowDownRand : 0; } // Stopped! if(lock && !speed){ var ai = Math.floor(((360 - deg - 90) % 360) / sliceDeg); // deg 2 Array Index ai = (slices+ai)%slices; // Fix negative index return alert("You got:/n"+ label[ai] ); // Get Array Item from end Degree } drawImg(); window.requestAnimationFrame( anim ); }()); }, false);

Aquí está mi html

<div id="wheel"> <canvas id="canvas" width="300" height="300"></canvas> </div> <button id="spin">Stop!</button> <button id="play">play!</button>

Por favor, ayúdame. Violín de trabajo está aquí


Podría usar un lienzo fuera de pantalla, donde lo haría

  • dibuja la primera imagen, en la rotación actual,
  • aplicar composición sobre él con la mitad de las rebanadas (1/2)
  • dibuje este lienzo fuera de pantalla en el principal,
  • repita las mismas operaciones con la segunda imagen

Aquí hay una fea prueba de base de concepto en tu código, es realmente feo, así que reescríbelo por favor.

// First, load our images var srcs = ["https://images.pexels.com/photos/172292/pexels-photo-172292.jpeg?w=500&h=500&auto=compress&cs=tinysrgb", "https://static.pexels.com/photos/218434/pexels-photo-218434.jpeg?w=500&h=200&auto=compress&cs=tinysrgb" ]; var loaded = 0; function onload() { if (++loaded >= srcs.length) drawImg(); } var imgs = srcs.map(s => Object.assign(new Image, { onload: onload, src: s })); function rand(min, max) { return Math.random() * (max - min) + min; } var color = [''#fbc'', ''#f88'', ''#fbc'', ''#f88'', ''#fbc'', ''#f88'', "#fbc", "#f67"]; var label = [''10'', ''200'', ''50'', ''100'', ''5'', ''500'', ''0'', "jPOT"]; var slices = color.length; var sliceDeg = 360 / slices; var deg = rand(0, 360); var speed = 0; var slowDownRand = 0; var ctx = canvas.getContext(''2d''); var ctx1 = canvas.cloneNode().getContext(''2d''); // create an offscreen context var width = canvas.width; // size var center = width / 2; // center var isStopped = false; var lock = false; function deg2rad(deg) { return deg * Math.PI / 180; } function drawSlice(deg, color) { ctx1.moveTo(center, center); ctx1.arc(center, center, width / 2, deg2rad(deg), deg2rad(deg + sliceDeg)); ctx1.lineTo(center, center); ctx1.closePath(); } function drawText(deg, text) { // this should probably be rewritten ctx1.save(); ctx1.translate(center, center); ctx1.rotate(deg2rad(deg)); ctx1.textAlign = "right"; ctx1.fillStyle = "#fff"; ctx1.font = ''bold 30px sans-serif''; ctx1.fillText(text, 130, 10); ctx1.restore(); } function drawOnHiddenCanvas(index) { // we rotate the whole context ctx1.translate(canvas.width / 2, canvas.height / 2); ctx1.rotate(deg2rad(deg)); ctx1.translate(-canvas.width / 2, -canvas.height / 2); // so even our image is rotated ctx1.drawImage(imgs[index], 0, 0); // new drawn pixels will act as an mask (previous drawn pixels will remain) ctx1.globalCompositeOperation = ''destination-atop''; ctx1.beginPath(); // draw one on 2 slices for (var i = index; i < slices; i += 2) { drawSlice((sliceDeg * i), color[i], ctx); } ctx1.fill(); // fill only after all your shapes are done ctx1.globalCompositeOperation = ''source-over''; for (var i = index; i < slices; i += 2) { drawText((sliceDeg * i) + sliceDeg / 2, label[i]); } // reset the normal matrix ctx1.setTransform(1, 0, 0, 1, 0, 0); // draw this state on the main canvas ctx.drawImage(ctx1.canvas, 0, 0); } function drawImg() { ctx.clearRect(0, 0, width, width); drawOnHiddenCanvas(0); drawOnHiddenCanvas(1); } document.getElementById("spin").addEventListener("mousedown", function() { isStopped = true; }, false); document.getElementById("play").addEventListener("mousedown", function() { (function anim() { deg += speed; deg %= 360; // Increment speed if (!isStopped && speed < 3) { speed = speed + 1 * 8; } // Decrement Speed if (isStopped) { if (!lock) { lock = true; slowDownRand = rand(0.994, 0.998); } speed = speed > 0.2 ? speed *= slowDownRand : 0; } // Stopped! if (lock && !speed) { var ai = Math.floor(((360 - deg - 90) % 360) / sliceDeg); // deg 2 Array Index ai = (slices + ai) % slices; // Fix negative index return alert("You got:/n" + label[ai]); // Get Array Item from end Degree } drawImg(); window.requestAnimationFrame(anim); }()); }, false);

#wheel{ display:inline-block; position:relative; overflow:hidden; } #wheel:after{ content:""; background:red; border:2px solid white; position:absolute; top:-7px; left:50%; width:10px; height:10px; margin-left:-7px; transform: rotate(45deg) }

<div id="wheel"> <canvas id="canvas" width="300" height="300"></canvas> </div> <button id="spin">Stop!</button> <button id="play">play!</button>