2011-11-02 4 views
8

hereHtml5キャンバスメソッド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

この機能を使用する場合は、テストを実行するたびにパスを再構築する必要があります(fillまたはstrokeを呼び出さないでください)。

多くのオブジェクトがあり、速度が重要な場合は、自分のポイントインポリゴンテスト機能または自分の空間データ構造を使用しています。

キャンバスは単なるビットマップであり、描画に使用するコマンドは保存されません。そのため、シェイプを描いた後にチェックを行うことができず、現在のパスだけをテストすることができます。

fillまたはstrokeを呼び出した場合、beginPathを呼び出すと、前のパスジオメトリは破棄され、影響を受けるピクセルのみが表示されます。

は、キャンバスのピクセルの色をチェックする意味があり、あなたのケースであってよい...

+2

私のコードでも同様の必要性があり、6502で示唆されているように、自分のデータ構造にポイントを格納し、ヒットテストに独自のポイント・イン・ポリゴン関数を使用しました。キャンバスAPIは実際にヒットテストをサポートしていません。 – dgvid

+0

...ヒットテストが処理される「」ではなく、SVGのような保持されたグラフィックスモードAPIを使用することを検討してください。必要に応じて、ピクセルごとの効果のために ''を合成することもできます。 – Phrogz

2

私はちょうどキャンバス仕様に新たに追加がパス()オブジェクトであることを読みました。おそらくこれらは保存され、その後にテストされ、および/または再生される可能性がある。役に立つかもしれない。私が仕様を正しく理解していれば。あなたの問題を説明する、シンプルでエレガントな、そして適切に切り詰めダウンテストケースのため

http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects

+0

新しいPath2Dオブジェクトを使用すると、パスを変数として保存できるようになりました。この質問と回答を参照してください。http://stackoverflow.com/a/28913470 –

関連する問題