ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
パス描画の基本フロー
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
// ★ 基本パターン
ctx.beginPath(); // 1. パスを開始
ctx.moveTo(10, 10); // 2. 始点へ
ctx.lineTo(100, 10); // 3. 各種描画
ctx.lineTo(100, 100);
ctx.closePath(); // 4. 始点に戻す (任意)
ctx.strokeStyle = '#000';
ctx.stroke(); // 5. 線を描く
// または
ctx.fillStyle = '#3498db';
ctx.fill(); // 5'. 塗りつぶす
beginPath() を毎回呼ぶのが鉄則。呼ばないと前の stroke() 対象が累積し、線幅変更が過去パスにも適用される事故が起きます。
直線とポリライン
// 一本の直線
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(200, 100);
ctx.stroke();
// 三角形
ctx.beginPath();
ctx.moveTo(100, 50);
ctx.lineTo(200, 200);
ctx.lineTo(50, 200);
ctx.closePath(); // 3 辺目を自動で描いて閉じる
ctx.stroke();
// 折れ線 (ポリライン)
ctx.beginPath();
ctx.moveTo(0, 100);
[50, 80, 120, 200, 250].forEach((y, i) => {
ctx.lineTo(i * 50, y);
});
ctx.stroke();
円弧 (arc / arcTo)
// arc(x, y, radius, startAngle, endAngle, counterclockwise)
ctx.beginPath();
ctx.arc(100, 100, 50, 0, Math.PI * 2); // 完全な円
ctx.stroke();
// 半円 (右半分)
ctx.beginPath();
ctx.arc(100, 100, 50, -Math.PI / 2, Math.PI / 2);
ctx.stroke();
// 反時計回り
ctx.beginPath();
ctx.arc(100, 100, 50, 0, Math.PI, true);
ctx.stroke();
// arcTo(x1, y1, x2, y2, radius)
// 現在位置から (x1,y1) へ向かい、半径 radius の角丸を描いて (x2,y2) 方向へ
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.arcTo(150, 50, 150, 150, 30); // 30 で角丸の四角
ctx.lineTo(150, 200);
ctx.stroke();
2 次ベジェ (quadraticCurveTo)
// quadraticCurveTo(cpx, cpy, x, y)
// 現在位置から (x, y) へ、(cpx, cpy) を制御点として 2 次ベジェ
ctx.beginPath();
ctx.moveTo(50, 200);
ctx.quadraticCurveTo(150, 50, 250, 200); // 山型
ctx.stroke();
// 制御点を可視化
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(150, 50, 4, 0, Math.PI * 2);
ctx.fill();
3 次ベジェ (bezierCurveTo)
// bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
// 制御点 2 つで S 字なども描ける
ctx.beginPath();
ctx.moveTo(50, 200);
ctx.bezierCurveTo(
100, 50, // 制御点 1
200, 350, // 制御点 2
250, 200, // 終点
);
ctx.stroke();
楕円 (ellipse)
// ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle)
ctx.beginPath();
ctx.ellipse(150, 100, 80, 40, 0, 0, Math.PI * 2);
ctx.stroke();
// 45 度回転した楕円
ctx.beginPath();
ctx.ellipse(150, 100, 80, 40, Math.PI / 4, 0, Math.PI * 2);
ctx.stroke();
Path2D オブジェクト
Path2D はパスを再利用可能なオブジェクトとして持てる API。同じ図形を何度も描く場合に便利:
// パスを 1 度作成
const triangle = new Path2D();
triangle.moveTo(0, 0);
triangle.lineTo(50, 0);
triangle.lineTo(25, 40);
triangle.closePath();
// 何度でも使える
for (let i = 0; i < 5; i++) {
ctx.save();
ctx.translate(i * 60, 0);
ctx.fillStyle = `hsl(${i * 60}, 70%, 50%)`;
ctx.fill(triangle);
ctx.restore();
}
// SVG パス文字列を直接渡せる ★
const star = new Path2D('M 50 0 L 60 35 L 95 35 L 67 55 L 78 90 L 50 70 L 22 90 L 33 55 L 5 35 L 40 35 Z');
ctx.fillStyle = 'gold';
ctx.fill(star);
線スタイル
ctx.lineWidth = 5; // 太さ
ctx.strokeStyle = '#e74c3c'; // 色
ctx.lineCap = 'round'; // butt | round | square (端の形状)
ctx.lineJoin = 'round'; // miter | round | bevel (角の形状)
ctx.miterLimit = 10; // miter のとがり制限
// 破線
ctx.setLineDash([10, 5]); // 10 描画 / 5 空白
ctx.lineDashOffset = 0;
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(250, 50);
ctx.stroke();
// 1 点鎖線
ctx.setLineDash([20, 5, 2, 5]);
// 元に戻す
ctx.setLineDash([]);
塗り潰し規則 (fill rule)
// 自己交差する図形で内側判定が変わる
ctx.fill('nonzero'); // ★ デフォルト
ctx.fill('evenodd'); // SVG と同じ規則 (奇数回交差で内側)
// 例: 五芒星
ctx.beginPath();
for (let i = 0; i < 5; i++) {
const a = -Math.PI / 2 + i * Math.PI * 4 / 5; // 2 つ飛ばし
const x = 100 + Math.cos(a) * 80;
const y = 100 + Math.sin(a) * 80;
i ? ctx.lineTo(x, y) : ctx.moveTo(x, y);
}
ctx.closePath();
ctx.fillStyle = 'gold';
ctx.fill('evenodd'); // 中央のくぼみが抜ける
パス操作系メソッドまとめ
| メソッド | 概要 |
|---|---|
beginPath() | パスをリセット |
closePath() | 始点に戻す直線を引く |
moveTo(x, y) | ペン位置を移動 (描画なし) |
lineTo(x, y) | 直線 |
quadraticCurveTo | 2 次ベジェ |
bezierCurveTo | 3 次ベジェ |
arc | 円弧 (中心 + 半径 + 角度) |
arcTo | 2 接線の間の角丸円弧 |
ellipse | 楕円 |
rect(x, y, w, h) | 矩形パス |
roundRect(x, y, w, h, r) | 角丸矩形 (Chrome 99+) |
stroke() / fill() | 描画実行 |
clip() | クリッピング領域に設定 |
isPointInPath | 当たり判定 |
SVG パスからの変換
SVG の d 属性のパス文字列はそのまま Path2D に渡せます:
// SVG 風のハート
const heart = new Path2D(`
M 100 30
C 100 10, 60 10, 60 50
C 60 80, 100 100, 100 130
C 100 100, 140 80, 140 50
C 140 10, 100 10, 100 30
Z
`);
ctx.fillStyle = '#e91e63';
ctx.fill(heart);
パフォーマンス Tips
- Path2D を再利用: 毎フレーム同じパスを作り直さない
beginPath()を必ず: パスが累積するとパフォーマンス劣化- 整数座標を使う:
0.5オフセットで半画素を回避すると線がシャープに - OffscreenCanvas + Worker: 重い描画は Worker に逃がす
- requestAnimationFrame でループ (setInterval ではなく)
FAQ
Q: 線が滲んで見える
A: 整数座標に +0.5 オフセットすると 1px ラインが滲まなくなります。ctx.translate(0.5, 0.5) も可。
Q: クリックしたパスを判定したい
A: ctx.isPointInPath(path, x, y) / ctx.isPointInStroke(path, x, y)。Path2D 渡しが推奨。
Q: 矢印を描きたい
A: 線端に三角形を描く。角度は Math.atan2(dy, dx) で求めて rotate + 三角形 fill。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?