2011-11-02 48 views
8

示例hereHtml5 Canvas方法isPointInPath只確定最後一個對象

var context=document.getElementById("canvas").getContext("2d"); 

//Red Box 
context.beginPath(); 
context.fillStyle="Red"; 
context.rect(10,10,50,50); 
context.fill(); 

//Pink circle 
context.beginPath(); 
context.lineWidth="3"; 
context.fillStyle="Pink"; 
context.arc(250,250,50,0,Math.PI*2,false); 
context.fill(); 
context.stroke(); 

context.font="1.2em Verdana"; 
context.fillStyle="Black"; 
context.fillText(context.isPointInPath(35,35),35,35); 
context.fillText(context.isPointInPath(250,250),250,250); 

如果你亂寫beginPath方法檢測到的所有對象。 如何識別畫布上的對象或省略beginPath?

+0

+1一種簡單,大方,並適當削減的測試案例,解釋你的問題。 – Phrogz

回答

8

如果要使用該功能,則需要在每次要執行測試時重新生成路徑(不要撥打fillstroke)。

如果有很多物體和速度很重要,我通常會做的是使用我自己的點多邊形測試函數或我自己的空間數據結構。

請注意,畫布僅僅是一個位圖,它並不存儲您用來繪製的命令。這就是爲什麼在繪製形狀後無法進行檢查,只能測試當前路徑。

一旦您呼叫beginPath,以前的路徑幾何圖形將被丟棄,如果您調用fillstroke,則只有受影響的像素具有。

可能對你的情況下,它可能是有意義的檢查畫布像素的顏色...

+2

我在我的代碼中有類似的需求,正如6502所建議的那樣,我將這些點存儲在我自己的數據結構中,並使用我自己的點中多邊形函數進行點擊測試。 canvas API實際上不支持非平凡的命中測試。 – dgvid

+0

...或者您可能要考慮使用像SVG這樣的保留圖形模式API而不是'',在這裏爲您處理命中測試。您仍然可以根據每個像素效果的需要複合''。 – Phrogz

相關問題