我遇到的問題非常簡單。這是「我怎樣才能在形狀上畫一個洞?」的變體問題,經典答案是「簡單地在同一條路徑中繪製兩個形狀,但是順時針繪製實體,逆時針繪製」孔「。這很棒,但我需要的「洞」往往是複合形狀,由多個圈組成。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