どうだい、このパス。良いラインしてるだろう・・・
塗りつぶし・クリッピング・座標とパスの確認
最後は文字だけじゃピンとこない感じですね。
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); });