HTML5 Canvasで線幅を連続的に変化させた線を描画する方法
HTML5 Canvasで線幅が連続的に変化する線を描画する
HTML5のCanvas APIには、1回のストローク内で線の太さ(lineWidth)を連続的に変化させる機能は標準では用意されていません。しかし、短いセグメントに分割して描画し、各セグメントごとに異なるlineWidthを設定することで、あたかも一本の線のように見える「先細り」や「なだらかに広がる」線を実現できます。
以下のコードは、円形の軌跡に沿って線幅を徐々に変化させながら滑らかな曲線を描く実装例です。
サンプルコード
var context = document.getElementById('canvas1').getContext('2d');
var pts = [null, null, null, null];
for(var i=-1; i<25; i=i+1)
{
var width = 0.5+i/2;
var m = 200;
var x = Math.cos(i/4) * 180;
var y = Math.sin(i/4) * 140;
pts[0] = pts[1];
pts[1] = pts[2];
pts[2] = { X:x, Y:y};
if(pts[0] == null)
continue;
var p0 = pts[0];
var p1 = pts[1];
var p2 = pts[2];
var x0 = (p0.X + p1.X) / 2;
var y0 = (p0.Y + p1.Y) / 2;
var x1 = (p1.X + p2.X) / 2;
var y1 = (p1.Y + p2.Y) / 2;
context.beginPath();
context.lineWidth = width;
context.strokeStyle = "blue";
context.moveTo(m+x0, m+y0);
context.quadraticCurveTo(m+p1.X, m+p1.Y, m+x1, m+y1);
context.stroke();
}コードの解説
このコードの仕組みを順番に見ていきましょう。
- 座標の計算:
Math.cos()とMath.sin()を使って、楕円状の軌跡上の点(x, y)を算出します。変数m(200)はキャンバス中央へのオフセットです。 - 点バッファの管理: 配列
ptsで直近の3点を保持します。新しい点が追加されるたびに古い点をずらしていき、常に直前の2点と現在の点を参照できるようにしています。 - 中間点による平滑化: 隣接する点の中間点
(x0, y0)と(x1, y1)を求め、その間をquadraticCurveTo()(二次ベジェ曲線)で結ぶことで、角のない滑らかな曲線を実現しています。 - 線幅の連続的変化: ループごとに
width = 0.5 + i/2として線幅を増加させ、各セグメントを個別のbeginPath()〜stroke()で描画することで、太さが段階的に変わる一本の線として表示されます。
応用のポイント
この手法は、筆圧に対応したペンツール、グラデーション風の装飾線、マウスの移動速度に応じて太さが変わるフリーハンド描画など、さまざまな用途に応用できます。iの範囲や係数を調整すれば、線幅の変化率や曲線の形状を自由にコントロールできます。
-
HTMLのcanvas要素におけるwidth属性の使い方を徹底解説
canvas要素のwidth属性とは HTMLの<canvas>要素におけるwidth属性は、キャンバスの幅をピクセル単位で指定するために使用します。キャンバス上に図形や画像を描画する際、描画領域のサイズを明示的に定義することで、意図したレイアウトを実現できます。 基本的な構文 width属性の基本的な記述方法は以下のとおりです。 <canvas width=pixels_val> pixels_val の部分には、キャンバスの幅として設定したい数値(ピクセル単位)を指定します。 width属性の実装例 それでは、<canvas>要素のwidth属性を実
-
【Python】tkinterでマウスのクリック座標に沿って線を描画する方法
マウスの座標に沿って線を引くには、マウスがクリックされるたびにその座標を取得する関数を作成し、連続する2点間に線を描画する仕組みが必要です。ここでは、実際のコード例を使いながら、その実装方法をわかりやすく解説します。 実装の手順 tkinterライブラリをインポートし、tkinterフレーム(ウィンドウ)のインスタンスを作成します。 geometryメソッドを使って、ウィンドウのサイズを設定します。 ユーザー定義メソッド「draw_line」を作成し、マウスがクリックされるたびにx座標とy座標を取得します。そして、Canvasのcreate_line()メソッドを使用して、直前の点と現在の点