HTML5 の canvas で円を描く |
作成日:2015-03-28 最終更新日: |
canvas の使い方として、今度は円を描く方法を調べる。 点(70, 70)から 半径 50 の円を描くにはどうするか。次のコマンドを使う。
ctx.beginPath(); ctx.arc(70, 70, 50, 0, Math.PI*2, false); ctx.stroke();
円弧を描くメソッドは arc である。引数の意味は次の通り。
arc(x, y, radius, startAngle, endAngle, anticlockwise) (x, y) を中心の位置、r を半径、startAngle を開始位置、endAngle を終端位置、 anticlockwise を方向 (デフォルトは時計回り) とする円弧を描く。
完全な円を描くときも arc を使う。開始位置を 0 、終端位置を Math.PI * 2 とすることで完全な円になる。
今回は座標変換を考えない。そのかわり線分との組み合わせを考えよう。 この円に内接する六角形を作ってみる。
上記の円周上の格子点として A(30, 40), B(40, 110), C(100, 110), D(110, 100), E(120, 70), F(110, 40) をとってみて、 六角形 ABCDEF を描いた結果である。 パスカルの定理によって、直線 AB と DE の交点 P, 直線 BC と直線 EF の交点 Q, 直線 CD と直線 FA の交点 R は一直線上にある。
次は、上で描いた六角形 ABCDEF に、 対辺の延長の交点を描いた図である。
参考 http://www.html5.jp/canvas/how2.html
同心円を描こうとして次のようにコードを記述した。
ctx.beginPath(); ctx.arc(100, 100, 80, 0, Math.PI*2, false); ctx.arc(100, 100, 60, 0, Math.PI*2, false); ctx.arc(100, 100, 40, 0, Math.PI*2, false); ctx.arc(100, 100, 20, 0, Math.PI*2, false); ctx.stroke();
ところが、同心円内部右側に、線が表示されてしまう。 これは、ひとつの円の軌跡解釈実行後に次の円に解釈実行にいくとき、 プロッターでいう「ペンを降ろしたまま」になってしまっていることが原因である。 線を出さないためには、「ペンを上げて目標座標で降ろす」処理を行なう ctx.moveTo を使って、 次のように記述しなければならない。
ctx.beginPath(); ctx.arc(100, 100, 80, 0, Math.PI*2, false); ctx.moveTo(160, 100); ctx.arc(100, 100, 60, 0, Math.PI*2, false); ctx.moveTo(140, 100); ctx.arc(100, 100, 40, 0, Math.PI*2, false); ctx.moveTo(120, 100); ctx.arc(100, 100, 20, 0, Math.PI*2, false); ctx.stroke();
なんか変な仕様だ。しかしこのように決められているのだから仕方がない。
参考 https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Canvas_tutorial/Drawing_shapes#Moving_the_pen