我遇到的问题非常简单。这是“我怎样才能在形状上画一个洞?”的变体问题,经典答案是“简单地在同一条路径中绘制两个形状,但是顺时针绘制实体,逆时针绘制”孔“。这很棒,但我需要的“洞”往往是复合形状,由多个圈组成。Javascript画布 - 在矩形中相交的圆孔或如何合并多个圆弧路径
视觉描述:http://i.imgur.com/9SuMSWT.png。
的jsfiddle:http://jsfiddle.net/d_panayotov/44d7qekw/1/
context = document.getElementsByTagName('canvas')[0].getContext('2d');
// green background
context.fillStyle = "#00FF00";
context.fillRect(0,0,context.canvas.width, context.canvas.height);
context.fillStyle = "#000000";
context.globalAlpha = 0.5;
//rectangle
context.beginPath();
context.moveTo(0, 0);
context.lineTo(context.canvas.width, 0);
context.lineTo(context.canvas.width, context.canvas.height);
context.lineTo(0, context.canvas.height);
//first circle
context.moveTo(context.canvas.width/2 + 20, context.canvas.height/2);
context.arc(context.canvas.width/2 + 20, context.canvas.height/2, 50, 0, Math.PI*2, true);
//second circle
context.moveTo(context.canvas.width/2 - 20, context.canvas.height/2);
context.arc(context.canvas.width/2 - 20, context.canvas.height/2, 50, 0, Math.PI*2, true);
context.closePath();
context.fill();
编辑:
多的解决方案已被提出,我觉得我的问题一直是误导性的。所以这里有更多信息: 我需要矩形区域作为阴影。以下是我正在制作的游戏截图(希望这不违反规则):http://i.imgur.com/tJRjMXC.png。
- 该矩形应该能够具有小于1.0的alpha。
- 显示在“孔”中的内容是在应用阴影之前在画布上绘制的任何内容。
@markE:
- 或者......来 “敲除”(删除)双圆... - “目的地出” 代替画布内容与设定背景。 http://jsfiddle.net/d_panayotov/ab21yfgd/ - 孔是蓝色而不是绿色。
- 另一方面... - “source-atop”需要在定义剪贴蒙版后绘制内容。这在我的情况下将效率低下(光被绘制为同心圆,阴影区域仍然可见)。
@ hobberwickey: 这是一个静态背景,而不是实际的画布内容。然而,我可以像使用“source-atop”一样使用clip(),但效率不高。
我现在已经实施的解决方案:http://jsfiddle.net/d_panayotov/ewdyfnj5/。我只是在主要画布内容上绘制修剪过的矩形(在内存中)。有更快/更好的解决方案吗?
什么是你的代码? – Xufox 2015-04-01 16:03:51
用一个简单的例子更新了我的问题。 – 2015-04-01 16:06:15
我认为你必须做出一个包含两个相同路径的方形的图形...... – Xufox 2015-04-01 16:14:14