これを実現する方法は他にもありますが、このコンテキストでおそらく最も役立つのは、変換とクリップ マスクを使用する方法です。
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
/// for simplicity, save current settings
ctx.save();
/// move coordinate system to the upper left corner of isolated region
ctx.translate(offsetX, offsetY);
/// create a clipping mask by using a simple rectangle
ctx.beginPath();
ctx.rect(0, 0, width, height);
/// define the last path (rectangle) as clipping mask
ctx.clip();
/// ... draw other things into this region from offset 0...
ctx.restore(); /// done and back to full canvas
座標系全体を領域の左上隅に移動することにより、新しい孤立した領域に対するオフセットを使用できます。クリップ マスクを追加すると、領域外に描画されたものはすべてクリップされます。
これは、リージョンごとに 1 つずつ行う必要があります。
もう 1 つの方法は、すべての描画ポイントにオフセットを追加することです。例えば:
ctx.lineTo(x + offsetX, y + offsetY);
はoffsetX/Y
領域の左上隅です。
ただし、クリッピングが必要な場合はさらに複雑になります。画像では宛先領域を定義できるため、大きな問題ではありませんが、線やその他のパス操作では、補間などを使用して自分でクリッピングする必要があります。
これを示すライブデモは次のとおりです:
Fiddle (更新されたリンク)
- デモでは、キャンバスとコンテキストを設定し、全体を赤色で塗りつぶします。
- 次に、クリッピングとマスクを設定して翻訳します。
- これで「仮想キャンバス」ができ、他のグラフィックはそのままです
- 同じ塗りつぶし操作で領域を塗りつぶしますが、青で塗りつぶします。サイズが実際の領域外であっても、この領域のみが塗りつぶされていることがわかります
- 次に、クリップを取り外し、フル モードに戻ったことを示す証拠として線を引きます。