【发布时间】:2015-06-06 08:53:10
【问题描述】:
我遇到的问题非常简单。这是“如何在形状上画一个洞?”的变体。问题,经典答案是“只需在同一条路径上绘制两个形状,但顺时针绘制实体,逆时针绘制“孔”。这很好,但我需要的“洞”通常是一个复合形状,由多个圆圈组成。
视觉描述: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:
- 或者...“淘汰”(擦除)双圈... - “destination-out”用设置的背景替换画布内容。 http://jsfiddle.net/d_panayotov/ab21yfgd/ - 孔是蓝色而不是绿色。
- 另一方面... - “source-atop”要求在定义剪贴蒙版后绘制内容。在我的情况下,这将是低效的(光被绘制为同心圆,阴影区域仍然可见)。
@hobberwickey: 那是一个静态背景,而不是实际的画布内容。但是,我可以像使用“source-atop”一样使用 clip(),但这会效率低下。
我现在实施的解决方案:http://jsfiddle.net/d_panayotov/ewdyfnj5/。我只是在主画布内容上绘制剪切的矩形(在内存画布中)。有更快/更好的解决方案吗?
【问题讨论】:
-
用一个简单的例子更新了我的问题。
-
我认为你必须在同一路径上制作一个包含两个方舟的形状......
-
寻找圆-圆交点和计算复合周长的复杂性超过了整个项目的复杂性。在确定这是唯一的选择之前,我不想重新发明轮子。
-
鉴于您对问题的补充,我在回答中添加了一些想法。祝你的项目好运! :-)
标签: javascript canvas path clipping