ChatGPT先生と一緒に学ぶフロントエンド D3.js編 その2

本記事では第1部の「第3章 SVGとは何か」を取り上げます。

  • SVGとはなにか
  • SVGの基本要素の一覧と主要なパラメータ
  • 基本要素の一つの「パス」を描画する命令
  • SVG要素のグループ化について

SVGとは何か

SVGはScalable Vector Graphicsの頭文字を取ったものです。ベクトルベースのグラフィックを描画するためのマークアップ言語の1つです。

なるほど。

SVGXMLの一種なのでXMLの書式がそのまま利用できます。

知らなかった。ちなみに先生に聞いてみると

SVGデータとは何ですか?
SVGは、スケーラブルベクターグラフィックス(Scalable Vector Graphics)の略称です。SVGXMLベースの画像形式で、Webページやドキュメント内で使用するために設計されたオープンスタンダードのベクター画像形式です。
SVGは、図形、テキスト、画像、アニメーション、ボタンなど、様々な種類のコンテンツを含むことができます。SVGは、コンピューターの解像度やサイズに関係なく、クリアで鮮明な画像を提供することができます。
また、SVGは、ベクター形式のため、拡大縮小しても画質が劣化しないという利点があります。SVGファイルは、テキストベースであるため、編集が容易であり、JavaScriptを使用してアニメーションやインタラクティブな機能を追加することもできます。SVGは、ウェブ開発者、グラフィックデザイナー、イラストレーターなど、多くの人々によって広く使用されています。」

よくご存知でした。

SVGの基本要素の一覧と主要なパラメータ

本章ではまず基本図形をSVGで描画する方法を学びます。書籍で提示されている図形要素は以下の8種類です。

  • rect(矩形):指定された位置に矩形を描画する要素。x、y、width、height属性を使用して位置とサイズを指定できる。
  • circle(円):指定された中心点を中心に、指定された半径の円を描画する要素。cx、cy、r属性を使用して中心点と半径を指定できる。
  • ellipse(楕円):指定された中心点を中心に、指定されたx軸とy軸の半径を持つ楕円を描画する要素。cx、cy、rx、ry属性を使用して中心点と半径を指定できる。
  • line(線):指定された始点と終点を結ぶ線を描画する要素。x1、y1、x2、y2属性を使用して始点と終点の座標を指定できる。
  • polyline(ポリライン):指定された座標を結んで描画する多角線を描画する要素。points属性を使用して座標を指定できる。
  • polygon(ポリゴン):指定された座標を結んで描画する多角形を描画する要素。points属性を使用して座標を指定できる。
  • path(パス):線、曲線、弧、閉じた領域を描画する複合的な図形を描画するための要素。d属性を使用してパスデータを指定する。
  • text(テキスト):指定された位置にテキストを描画する要素。x、y属性を使用して位置を指定し、text-anchor属性を使用して水平方向の配置を指定し、font-size属性を使用してフォントサイズを指定できる。

実際にサンプルを先生に書いてもらいました。

以下の図形要素をSVGで描画するサンプルコードをそれぞれ書いて、一つのHTMLファイルにまとめてください。
- rect
- circle
- elipse
- line
- polyline
- polygon
- path
- text
「以下は、上記のSVG要素を一つのHTMLファイルにまとめたサンプルコードです。」

<!DOCTYPE html>
<html>
  <head>
    <title>SVG Sample</title>
  </head>
  <body>
    <svg width="300" height="300">
      <rect x="20" y="20" width="100" height="100" fill="blue" />
      <circle cx="200" cy="60" r="50" fill="red" />
      <ellipse cx="150" cy="150" rx="80" ry="40" fill="green" />
      <line x1="20" y1="200" x2="280" y2="200" stroke="black" stroke-width="2" />
      <polyline points="30,250 70,250 50,290 90,290" fill="none" stroke="black" stroke-width="2" />
      <polygon points="150,220 200,280 250,220" fill="yellow" stroke="black" stroke-width="2" />
      <path d="M 30 150 L 150 30 L 270 150" fill="none" stroke="black" stroke-width="2" />
      <text x="150" y="170" text-anchor="middle" font-size="40" fill="purple">SVG</text>
    </svg>
  </body>
</html>

ChatGPTが生成したSVG基本要素のサンプル
ChatGPTが生成したSVG基本要素のサンプル

すごい。芸術的なサンプルを書いてくれました。ここに登場している変数の意味も尋ねました。

「以下は、上記のSVGのサンプルコードで使用されている変数の意味です。」

  • width:SVGイメージの横幅を指定する属性。
  • height:SVGイメージの縦幅を指定する属性。
  • rect:矩形を描画する要素。
  • x:矩形の左上隅のx座標を指定する属性。
  • y:矩形の左上隅のy座標を指定する属性。
  • width:矩形の幅を指定する属性。
  • height:矩形の高さを指定する属性。
  • fill:矩形の塗りつぶし色を指定する属性。
  • circle:円を描画する要素。
  • cx:円の中心のx座標を指定する属性。
  • cy:円の中心のy座標を指定する属性。
  • r:円の半径を指定する属性。
  • ellipse:楕円を描画する要素。
  • rx:楕円のx軸半径を指定する属性。
  • ry:楕円のy軸半径を指定する属性。
  • line:線を描画する要素。
  • x1:線の始点のx座標を指定する属性。
  • y1:線の始点のy座標を指定する属性。
  • x2:線の終点のx座標を指定する属性。
  • y2:線の終点のy座標を指定する属性。
  • stroke:線の色を指定する属性。
  • stroke-width:線の太さを指定する属性。
  • polyline:多角線を描画する要素。
  • points:多角線の座標を指定する属性。
  • polygon:多角形を描画する要素。
  • path:複合的な図形を描画する要素。
  • d:パスデータを指定する属性。
  • text:テキストを描画する要素。
  • text-anchor:テキストの水平方向の配置を指定する属性。
  • font-size:テキストのフォントサイズを指定する属性。
  • fill:テキストの塗りつぶし色を指定する属性。

パスデータを指定するd属性の表記が見慣れないので、再度質問してみます。

path d="M 30 150 L 150 30 L 270 150"の"M 30 150 L 150 30 L 270 150"はどういう意味ですか?
「『M 30 150 L 150 30 L 270 150』は、パスデータと呼ばれる文字列で、要素で描画されるパスの形状を定義します。

Mは、パスの始点を表します。この場合、始点は座標 (30, 150) に設定されています。Lは、直線を描画するコマンドで、その後に続く座標を終点として直線を引きます。したがって、L 150 30は、座標 (30, 150) から座標 (150, 30) までの直線を描画することを意味します。同様に、L 270 150は、座標 (150, 30) から座標 (270, 150) までの直線を描画します。

これにより、(30, 150) を始点とし、(150, 30) と (270, 150) を結ぶ三角形の輪郭が描画されます。」

基本要素の一つの「パス」を描画する命令

d属性では他にどのような命令が可能ですか? 「d属性では、以下のような命令が可能です。

  • M:指定された座標に移動する(Move to)。
  • L:指定された座標まで直線を描画する(Line to)。
  • H:指定されたx座標まで水平線を描画する(Horizontal line to)。
  • V:指定されたy座標まで垂直線を描画する(Vertical line to)。
  • A:指定された半径を持つ円弧を描画する(Arc)。
  • C:3つの制御点を指定して、指定された座標までのカーブを描画する(Cubic Bezier curve)。
  • S:2つの制御点と終点を指定して、指定された座標までのカーブを描画する(Smooth cubic Bezier curve)。
  • Q:1つの制御点を指定して、指定された座標までのカーブを描画する(Quadratic Bezier curve)。
  • T:1つの制御点と終点を指定して、指定された座標までのカーブを描画する(Smooth quadratic Bezier curve)。
  • Z:現在のパスの始点までの直線を描画し、パスを閉じる(Close path)。

これらの命令を組み合わせて、複雑なパスを描画することができます。」

これらの命令を使った複雑なパスの例をそれぞれの命令について、図形名とサンプルのHTMLコードを挙げながら書いてください。 M:指定された座標に移動する(Move to) 図形名:「ドクロ」

<svg width="300" height="300">
  <path d="M 100 50 A 25 25, 0, 0, 0, 150 50 A 25 25, 0, 0, 0, 100 50 M 130 75 A 20 20, 0, 0, 1, 130 125 L 160 125 A 20 20, 0, 0, 1, 160 75 Z" fill="black" />
</svg>


このSVGイメージは、ドクロを描画しています。M命令で始点を設定し、A命令で円弧を描画し、最後に同じ始点に移動していることに注意してください。図形の塗りつぶし色は黒色で、塗りつぶされた面積のみを描画するために、線は描画されていません。

L:指定された座標まで直線を描画する(Line to) 図形名:「三角形の山」

<svg width="300" height="300">
  <path d="M 50 200 L 80 120 L 110 200 L 140 120 L 170 200 L 200 120 L 230 200" fill="none" stroke="black" stroke-width="2" />
</svg>


このSVGイメージは、三角形の山を描画しています。M命令で始点を設定し、L命令で複数の座標までの直線を描画します。図形の塗りつぶし色はなく、輪郭の色は黒色、幅は2です。

H:指定されたx座標まで水平線を描画する(Horizontal line to) 図形名:「曲線上を進む四角形」

<svg width="300" height="300">
  <path d="M 50 100 Q 100 0, 150 100 H 50 Z" fill="red" />
  <path d="M 200 100 Q 250 0, 300 100 H 200 Z" fill="green" />
</svg>


このSVGイメージは、曲線上を進む四角形を描画しています。M命令で始点を設定し、Q命令で曲線を描画します。次に、H命令で指定されたx座標まで水平線を描画し、最後Z命令でパスを閉じます。図形の塗りつぶし色は、赤色と緑色です。それぞれの四角形は、曲線上に描画されています。

V:指定されたy座標まで垂直線を描画する(Vertical line to) 図形名:「バナナ」

<svg width="300" height="300">
  <path d="M 150 150 Q 250 200, 200 300 V 150 Z" fill="yellow" stroke="black" stroke-width="2" />
</svg>


このSVGイメージは、バナナを描画しています。M命令で始点を設定し、Q命令で曲線を描画します。次に、V命令で指定されたy座標まで垂直線を描画し、最後にZ命令でパスを閉じます。図形の塗りつぶし色は黄色で、輪郭の色は黒色、幅は2です。

A:指定された半径を持つ円弧を描画する(Arc) 図形名:「風車」

<svg width="300" height="300">
  <path d="M 150 150 L 150 50 A 100 100, 0, 0, 0, 200 100 L 150 150" fill="none" stroke="black" stroke-width="2" />
  <circle cx="150" cy="150" r="50" fill="red" />
</svg>


このSVGイメージは、風車を描画しています。M命令で始点を設定し、L命令で線を描画します。次に、A命令で指定された半径を持つ円弧を描画します。図形の塗りつぶし色はなく、風車の輪郭は黒色、幅は2です。風車の中心には、赤色の円が描画されています。

C:3つの制御点を指定して、指定された座標までのカーブを描画する(Cubic Bezier curve) 図形名:「波」

<svg width="300" height="300">
  <path d="M 50 150 C 100 50, 200 250, 250 150 C 280 100, 320 50, 350 100 C 400 200, 500 50, 550 150" fill="none" stroke="blue" stroke-width="3" />
</svg>


このSVGイメージは、波を描画しています。M命令で始点を設定し、C命令で3つの制御点を指定して、指定された座標までのカーブを描画します。図形の塗りつぶし色はなく、輪郭の色は青色で、幅は3です。

S:2つの制御点と終点を指定して、指定された座標までのカーブを描画する(Smooth cubic Bezier curve) 図形名:「楕円」

<svg width="300" height="300">
  <path d="M 50 150 C 50 50, 150 50, 150 150 S 250 250, 250 150 C 250 50, 350 50, 350 150 S 450 250, 450 150" fill="none" stroke="purple" stroke-width="3" />
</svg>


このSVGイメージは、楕円を描画しています。M命令で始点を設定し、最初のC命令で3つの制御点を指定して、カーブを描画します。次に、S命令で2つの制御点と終点を指定して、次のカーブを描画します。図形の塗りつぶし色はなく、輪郭の色は紫色で、幅は3です。

Q:1つの制御点を指定して、指定された座標までのカーブを描画する(Quadratic Bezier curve) 図形名:「花」

<svg width="300" height="300">
  <path d="M 150 50 Q 200 100, 150 150 Q 100 200, 150 250 Q 200 200, 250 250 Q 300 200, 250 150 Q 200 100, 250 50 Q 200 0, 150 50" fill="none" stroke="pink" stroke-width="2" />
</svg>


このSVGイメージは、花を描画しています。M命令で始点を設定し、Q命令で1つの制御点を指定して、指定された座標までのカーブを描画します。図形の塗りつぶし色はなく、輪郭の色はピンク色で、幅は2です。T:1つの制御点と終点を指定して、指定された座標までのカーブを描画する(Smooth quadratic Bezier curve) 図形名:「鳥」

<svg width="300" height="300">
  <path d="M 50 150 Q 150 50, 250 150 T 450 150" fill="none" stroke="orange" stroke-width="3" />
  <circle cx="150" cy="125" r="25" fill="orange" />
  <circle cx="250" cy="125" r="25" fill="orange" />
</svg>


このSVGイメージは、鳥を描画しています。M命令で始点を設定し、最初のQ命令で1つの制御点を指定して、カーブを描画します。次に、T命令で1つの制御点と終点を指定して、次のカーブを描画します。図形の塗りつぶし色はなく、輪郭の色はオレンジ色で、幅は3です。鳥の目は、オレンジ色の円で描画されています。

Z:現在のパスの始点までの直線を描画し、パスを閉じる(Close path) 図形名:「星」

<svg width="300" height="300">
  <path d="M 150 50 L 180 120 L 250 120 L 200 170 L 220 240 L 150 200 L 80 240 L 100 170 L 50 120 L 120 120 Z" fill="gold" stroke="black" stroke-width="3" />
</svg>


このSVGイメージは、星を描画しています。M命令で始点を設定し、L命令で直線を描画します。最後に、Z命令でパスを閉じます。図形の塗りつぶし色は金色で、輪郭の色は黒色で、幅は3です。

図形の解釈には議論がありそうですが、各命令の役割がよくわかりました。

SVG要素のグループ化について

3章の最後では複数のSVG要素をまとめて扱うグループ化について説明しています。先生に要約してもらいました。

SVG要素のグループ化とは何ですか?箇条書きで要点を4つ示してください。
SVG要素のグループ化とは、複数のSVG要素をひとつのまとまりとして扱うことです。以下は、SVG要素のグループ化の要点です。

  • g要素を使用して、複数のSVG要素をグループ化することができます。
  • グループ内の要素は、まとめて変換、操作、スタイル変更することができます。
  • g要素には、transform属性を使用して、グループ内のすべての要素に変換を適用することができます。
  • g要素には、style属性を使用して、グループ内のすべての要素にスタイルを適用することができます。 」