お寿司か焼き肉食べたい

まじめな事からしょーもない事まで
めにゅーを開く(投げやり)

どうだい、このパス。良いラインしてるだろう・・・

塗りつぶし・クリッピング・座標とパスの確認
最後は文字だけじゃピンとこない感じですね。

context.fill()

塗りつぶしです。
現在の塗りつぶしスタイルでサブパスを塗りつぶします。ベチャー
塗りつぶしには、fillStyleで設定してあげましょう。 塗りつぶしは、現在のパスに含まれるすべてのサブパスに対して適用されます。
閉じていないサブパスも塗りつぶされますが、実際にサブパスが閉じられるわけではありません。

var canvas1 = document.getElementById('canvas01');
canvas1.width = 200;
canvas1.height = 200;
if (canvas1.getContext) {
  var context1 = canvas1.getContext('2d');
  // 新しいパスを開始する
  context1.beginPath();
  // 四角の生成
  context1.rect(30, 50, 70, 70);
  // 塗りつぶし背景色の設定
  context1.fillStyle = '#FF0000';
  // 塗りつぶし
  context1.fill();
  // 輪郭線の描画
  context1.stroke();


  // 新しいパスを開始する
  context1.beginPath();
  // 100 30の位置に筆を置く
  context1.moveTo(50,30);
  // 制御点を150 70にセットし、曲線の終点を200 30に設定する
  context1.arcTo(130, 150, 220, 70, 80);
  // 塗りつぶし背景色の設定
  context1.fillStyle = '#00FFFF';
  // 塗りつぶし
  context1.fill();
  // 輪郭線の描画
  context1.stroke();
}

context.clip()

切り取りを行います。
選択した範囲のみ表示させる感じですね。
cssのoverflow:hiddenみたいな動作と思ってもらってもよいですが
clipは【切り取り領域を設定する】的なニュアンスで・・・
説明がややこしー
まずは、説明前に基本形。最初に四角作って円弧書いてます。

var canvas2 = document.getElementById('canvas02');
canvas2.width = 200;
canvas2.height = 200;
if (canvas2.getContext) {
  var context2 = canvas2.getContext('2d');
  // 新しいパスを開始する
  context2.beginPath();
  // 四角の生成
  context2.rect(40, 30, 80, 60);
  // 塗りつぶし背景色の設定
  context2.fillStyle = '#FF0000';
  // 塗りつぶし
  context2.fill();
  // 輪郭線の描画
  context2.stroke();

  // 新しいパスを開始する
  context2.beginPath();
  // 0 0の位置に筆を置く
  context2.moveTo(0,0);
  // 制御点を130 150 円半径220 終点x70y80とする
  context2.arcTo(130, 150, 220, 70, 80);
  // 塗りつぶし背景色の設定
  context2.fillStyle = '#00FFFF';
  // 塗りつぶし
  context2.fill();
  // 輪郭の描画
  context2.stroke();
}

では切り取りを行います。
切り取り範囲を四角描画部分にしてやってみましょう。

var canvas3 = document.getElementById('canvas03');
canvas3.width = 200;
canvas3.height = 200;
if (canvas3.getContext) {
  var context3 = canvas3.getContext('2d');
  // 新しいパスを開始する
  context3.beginPath();
  // 四角の生成
  context3.rect(40, 30, 80, 60);
  // 塗りつぶし背景色の設定
  context3.fillStyle = '#FF0000';
  // 塗りつぶし
  context3.fill();
  // 輪郭線の描画
  context3.stroke();

  //上で作成した四角を切り抜き対象とする
  context3.clip();
  // 切り抜き色の指定
  context3.fillStyle = '#000000';
  // x:40 y:20 w:100 h:100で切り抜き
  context3.fillRect(40,20,100,100);

  // 新しいパスを開始する
  context3.beginPath();
  // 0 0の位置に筆を置く
  context3.moveTo(0,0);
  // 制御点を130 150 円半径220 終点x70y80とする
  context3.arcTo(130, 150, 220, 70, 80);
  // 塗りつぶし背景色の設定
  context3.fillStyle = '#00FFFF';
  // 塗りつぶし
  context3.fill();
  // 輪郭の描画
  context3.stroke();
}

円弧部分おも消えてしまいました。
ジーザス
では今度は円弧部分を切り取り範囲としてやってみます。

var canvas4 = document.getElementById('canvas04');
canvas4.width = 200;
canvas4.height = 200;
if (canvas4.getContext) {
  var context4 = canvas4.getContext('2d');
  // 新しいパスを開始する
  context4.beginPath();
  // 四角の生成
  context4.rect(40, 30, 80, 60);
  // 塗りつぶし背景色の設定
  context4.fillStyle = '#FF0000';
  // 塗りつぶし
  context4.fill();
  // 輪郭線の描画
  context4.stroke();

  // 新しいパスを開始する
  context4.beginPath();
  // 0 0の位置に筆を置く
  context4.moveTo(0,0);
  // 制御点を130 150 円半径220 終点x70y80とする
  context4.arcTo(130, 150, 220, 70, 80);
  // 塗りつぶし背景色の設定
  context4.fillStyle = '#00FFFF';
  // 塗りつぶし
  context4.fill();
  // 輪郭の描画
  context4.stroke();

  //上で作成した円弧を切り抜き対象とする
  context4.clip();
  // 切り抜き色の指定
  context4.fillStyle = '#000000';
  // x:40 y:20 w:100 h:100で切り抜き
  context4.fillRect(40,20,100,100);
}

次は四角は生きていますが、円弧の中一部分が切り取られている事になりましたね

どういう事なん!?

そもそもclipは、呼び出される直前までに生成されたサブパスの図形で、切り取り窓がセットされます。
また、clipは、切り取り窓内に表示させたいものを描く前に、呼び出されなくてはいけません。
砕いた表現をすると 先に表示領域を決めておいてから、その中に表示したいものを描くようにしようね。って事です。
使いドコロはまぁ、難しいですが、まったく使わないメソッドでもない感じです。

context.isPointInPath(x, y)

指定座標がパスの内側にあるかどうかを確認する際に使用します。
座標(x, y)が現在のパスの内側にある場合にはtrue、外側にある場合にはfalseが返ります。

x40y30の位置にw80h60四角を生成しました。
この時、x100y100 x50y60 の2つの座標を指定した場合をみてみます。下記リンクから確認できます。

x40y30の位置にw80h60四角を生成って事なので、被り範囲としては
x40~120
y30~90
の双方が被る地点がアウトとみなされますね。

var canvas5 = document.getElementById('canvas05');
canvas5.width = 200;
canvas5.height = 200;
if (canvas5.getContext) {
  var context5 = canvas5.getContext('2d');
  // 新しいパスを開始する
  context5.beginPath();
  // x40y30の位置に四角の生成
  context5.rect(40, 30, 80, 60);
  // 塗りつぶし背景色の設定
  context5.fillStyle = '#FF0000';
  // 塗りつぶし
  context5.fill();
  // 輪郭線の描画
  context5.stroke();

  c05x100y100 = context5.isPointInPath(100,99);
  c05x50y60   = context5.isPointInPath(50,60);
}
$('.canvas05btn1').on('click',function(){ alert(c05x100y100); });
$('.canvas05btn2').on('click',function(){ alert(c05x50y60); });

先ほどの四角の下にさらにもう一つ作ってみます。
x40y100の位置にw80h60四角を生成しました。
この時、x100y100 x50y60 の2つの座標を指定した場合をみてみます。下記リンクから確認できます。

今回の範囲としては
x40~120 y30~90
x40~120 y100~160
がそれぞれ範囲となるため、x100y1002番目の四角に被っている(true)x50y60は最初の四角に被っている(true)
となればいいんですが、結果見た通り。なりませんでした。

切り取りの時も同じ問題がありました。
つまりこれも直前のパスに対しての条件がつきます。
なので、2番目の四角範囲は有効になるけど、最初の四角範囲は対象外となるわけですね
なんとも使い勝手が悪そうですが、回避策や実際にどうなの?って話は基本メソッドが終わってからにしましょう。

var canvas6 = document.getElementById('canvas06');
canvas6.width = 200;
canvas6.height = 200;
if (canvas6.getContext) {
  var context6 = canvas6.getContext('2d');
  // 新しいパスを開始する
  context6.beginPath();
  // x40y30の位置に四角の生成
  context6.rect(40, 30, 80, 60);
  // 塗りつぶし背景色の設定
  context6.fillStyle = '#FF0000';
  // 塗りつぶし
  context6.fill();
  // 輪郭線の描画
  context6.stroke();

  // 新しいパスを開始する
  context6.beginPath();
  // x40y30の位置に四角の生成
  context6.rect(40, 100, 80, 60);
  // 塗りつぶし背景色の設定
  context6.fillStyle = '#FF0000';
  // 塗りつぶし
  context6.fill();
  // 輪郭線の描画
  context6.stroke();

  c06x100y100 = context6.isPointInPath(100,100);
  c06x50y60   = context6.isPointInPath(50,60);
}
$('.canvas06btn1').on('click',function(){ alert(c06x100y100); });
$('.canvas06btn2').on('click',function(){ alert(c06x50y60); });