Encontré que hay un método clearRect()
, pero no puedo encontrar ninguno para borrar un arco (o un círculo completo).¿Cómo puedo borrar un arco o círculo en el lienzo HTML5?
¿Hay alguna manera de borrar un arco en el lienzo?
Encontré que hay un método clearRect()
, pero no puedo encontrar ninguno para borrar un arco (o un círculo completo).¿Cómo puedo borrar un arco o círculo en el lienzo HTML5?
¿Hay alguna manera de borrar un arco en el lienzo?
No, una vez que ha dibujado algo sobre un lienzo, no hay ningún objeto que borrar, solo los píxeles que ha dibujado. El método clearRect
no borra un objeto dibujado previamente, simplemente borra los píxeles en el espacio definido por los parámetros. Puede usar el método clearRect
para borrar el arco si conoce un rectángulo que lo contiene. Esto, por supuesto, eliminará cualquier otro píxel en el área, por lo que tendrá que volver a dibujarlos.
Este es un buen consejo. Si le preocupa borrar otro contenido alrededor de su arco, considere separar los objetos que está dibujando en varios lienzos (apilados uno encima del otro). De esta forma, un pequeño clearRect alrededor de su arco no terminará borrando parte del contenido de fondo, y aún puede evitar tomar el gran golpe de rendimiento de context.clearRect (0,0, screenWidth, screenHeight). –
No hay clearArc
sin embargo se puede utilizar operaciones de composición para lograr lo mismo
context.globalCompositeOperation = 'destination-out'
De acuerdo con MDC el efecto de este ajuste es
el vigente el contenido se mantiene donde no se superpone a la nueva forma.
https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Compositing
Así que cualquier forma rellena con este modo en acabará borrando el contenido de la lona actual.
Gracias! Cada fotograma de mi animación cayó de 7ms a 0.5ms usando este método. –
Puede usar el método clearRect() para borrar una parte del lienzo (incluido su arco), pero cuando usa clearRect() con arcos o cualquier otra cosa que haya utilizado beginPath() y closePath() para mientras dibuja, necesitará manejar las rutas mientras borra, también. De lo contrario, puede terminar con una versión descolorida de su arco que aún aparece.
//draw an arc (in this case, a circle)
context.moveTo(x, y);
context.beginPath();
context.arc(x,y,radius,0,Math.PI*2,false);
context.closePath();
context.strokeStyle = "#ccc";
context.stroke();
//now, erase the arc by clearing a rectangle that's slightly larger than the arc
context.beginPath();
context.clearRect(x - radius - 1, y - radius - 1, radius * 2 + 2, radius * 2 + 2);
context.closePath();
Esto es un equivalente circular de clearRect()
. Lo principal es configurar una operación compuesta por la respuesta de @moogoo.
var cutCircle = function(context, x, y, radius){
context.globalCompositeOperation = 'destination-out'
context.arc(x, y, radius, 0, Math.PI*2, true);
context.fill();
}
Ver https://developer.mozilla.org/samples/canvas-tutorial/6_1_canvas_composite.html:
He aquí un violín actualizada para usted también (utiliza clearRect): https://jsfiddle.net/x9ztn3vs/2/
Tiene una función clearApple:
block.prototype.clearApple = function() {
ctx.beginPath();
ctx.clearRect(this.x - 6, this.y - 6, 2 * Math.PI, 2 * Math.PI);
ctx.closePath();
}
Una vez necesita borrar formas complejas , la biblioteca de abstracción de lienzos podría ser útil. Esa es exactamente la razón por la que [construí uno] (http://kangax.github.com/fabric.js/). Tal vez podría ser útil. – kangax