第9章: パス

9.1. はじめに

パスは、塗りつぶしやストロークが可能な図形の輪郭を表します。パスはクリッピングパスとして使ったり、アニメーションの記述やテキストの配置にも使えます。パスはこれらの機能を同時に複数兼ねることも可能です。(塗りつぶし、ストローク、ペイントサーバークリッピングとマスキング、 アニメーション('animateMotion')、 パス上のテキスト参照。)

パスは「現在の点」という概念で記述されます。紙に描くことを例えると、現在の点はペンの位置と考えられます。ペンの位置を動かして、ペンを直線や曲線で引いて図形(開いた形・閉じた形)の輪郭をなぞることができます。

パスはオブジェクトの輪郭の幾何形状を表し、moveto(新しい現在の点の設定)、lineto(直線描画)、curveto(三次ベジエで曲線描画)、arc(楕円または円弧)、closepath(最後の moveto まで接続して現在の形状を閉じる)コマンドで定義されます。複合パス(複数サブパスを持つパス)も可能で、「ドーナツ型の穴」などの効果に使えます。

この章ではSVGパスの構文、挙動、DOMインターフェースについて説明します。SVGパスの実装ノートは‘path’ 要素実装ノートで参照できます。

パスはSVGでは path 要素で定義されます。

基本図形は全て、その 等価なパスがどうなるか、つまりその図形がパスとしてどのような形かで記述されています。(path 要素の等価なパスは単にそのパス自体です。) 基本図形を等価なパスとして定義するために、 セグメント完了型クローズパス操作が定義されていますが、これは現行のパス構文では表現できません。

9.2. ‘path’ 要素

path
カテゴリ:
グラフィック要素, 描画可能要素, 図形要素
内容モデル:
以下の要素を任意の順・任意の数で含めることができます:clipPath, marker, mask, script, style
属性:
幾何プロパティ:
DOMインターフェース:

path 要素の図形輪郭は d プロパティで指定します。下記パスデータ参照。

9.3. パスデータ

9.3.1. パスデータの一般情報

パスは path 要素を使い、その d プロパティでパスデータを指定することで定義されます。パスデータには movetolinetocurveto(三次・二次ベジエ両方)、arcclosepath 命令が含まれます。

Example triangle01 は三角形の形のパスを指定しています。( MmovetoLlinetozclosepath を示します)。

<?xml version="1.0" standalone="no"?>
<svg width="4cm" height="4cm" viewBox="0 0 400 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <title>Example triangle01- simple example of a 'path'</title>
  <desc>A path that draws a triangle</desc>
  <rect x="1" y="1" width="398" height="398"
        fill="none" stroke="blue" />
  <path d="M 100 100 L 300 100 L 200 300 z"
        fill="red" stroke="blue" stroke-width="3" />
</svg>
Example triangle01 — simple example of a 'path'

Example triangle01

この例をSVGで表示 (SVG対応ブラウザのみ)

パスデータには改行文字を含めることができ、可読性向上のため複数行に分割可能です。 マークアップ内の属性中の改行は、パース時に空白文字として正規化されます。

パスデータの構文は、ファイルサイズを最小限に抑え効率的なダウンロードを可能にするため簡潔に設計されています。多くのSVGファイルではパスデータが主要部分を占めるためです。SVGではパスデータを小さくするため、以下のような工夫があります:

パスデータの構文は前置記法(コマンド+パラメータ)です。許可される小数点は Unicode U+0046 FULL STOP(".")のみ(UnicodeではPERIOD、ドット、小数点とも呼ばれる)で、他の区切り文字は許可されません[UNICODE]。 (例:"13,000.56" は無効な数値、正しくは "13000.56" と記述してください。)

コマンドの相対バージョンでは、すべての座標値はコマンド開始時点の現在の点からの相対値です。

下記の表では、各パスコマンドの構文記述に以下の記号を使っています:

パスコマンドの説明で、cpxcpyは現在の点の座標を表します。

9.3.2. パスデータの指定:‘d’ プロパティ

名前: d
値: none | <string>
初期値: none
適用対象: path
継承: いいえ
パーセンテージ: N/A
メディア: visual
算出値: 指定通り
アニメーション可能 はい

d プロパティは path 要素の形状指定に使います。

none の値は、その要素にパスデータがないことを示します。path 要素の場合、レンダリングや祖先 コンテナ要素バウンディングボックスに寄与しません。

パスは複数のセグメントで構成され、movetoやclosepath以外の全てのコマンド(明示・暗黙)は1つの パスセグメント を定義します。

パスデータ内の全ての座標や長さは、現行ユーザー座標系のユーザー単位として扱われます。

<string> の値は、パスデータ文字列で形状を指定します。<string> の内容は下記svg-path EBNF文法に一致する必要があり、文字列内のエラーはパスデータのエラー処理のルールで処理されます。 パスデータ文字列に有効なコマンドがなければ、挙動は none と同じです。

アニメーションの場合、2つの d プロパティ値は、パスデータ文字列が同じ構造(コマンド数・種類・順序が完全一致)の場合のみ滑らかに補間できます。一致しない場合は、 補間離散 アニメーション型で行います。

パスデータコマンドリストが同じ構造の場合、各コマンドの各パラメータは 補間 により 実数として個別に補間されます。フラグやブール値は0~1の間で補間され、0以外は1/trueとみなします。

「dはパスデータ文字列を値とするプレゼンテーション属性(名称変更なし)になる」と ロンドン編集者会議で決定。

以下のセクションでは、パスデータ文字列で利用できるコマンドを一覧します。直線セグメントを描画するのは linetoコマンド (L, l, H, h, V, v) と closepathコマンド (Z, z) です。下記3グループのコマンドが曲線を描画します:

9.3.3. 「moveto」 コマンド

「moveto」コマンド(M または m)は新しい 初期点と新しい現在の点を確立します。効果は「ペンを持ち上げて新しい位置に移動する」ようなものです。パスデータセグメント(ある場合)は必ず「moveto」コマンドで始まります。以降の「moveto」コマンド(最初でない場合)は新しい サブパスの開始を表します:

コマンド 名称 パラメータ 説明
M(絶対)
m(相対)
moveto (x y)+ 指定した (x,y) 座標で新しいサブパスを開始します。 M(大文字)は絶対座標が続くことを示し、m(小文字)は相対座標が続くことを示します。movetoの後に複数の座標ペアが続く場合、後続のペアは暗黙のlineto命令とみなされます。したがって、暗黙のlineto命令はmovetoが相対なら相対、絶対なら絶対となります。パスの最初の要素として相対moveto(m)が現れた場合は絶対座標ペアとして扱われます。この場合、以降の座標ペアは相対扱いになりますが、最初のmoveto自体は絶対扱いです。

相対 m コマンドの場合、移動先は (cpx + x, cpy + y) です。

9.3.4. 「closepath」 コマンド

「closepath」(Z または z)は、現在のサブパスを初期点に戻して接続し終了します。 自動的に直線が現在の点からサブパスの初期点まで描かれます。このパスセグメントはゼロ長の場合もあります。

「closepath」の直後に「moveto」が続く場合、その「moveto」が次のサブパスの開始点となります。 「closepath」の直後に他のコマンドが続く場合、次のサブパスは現在のサブパスと同じ初期点から開始します。

サブパスが「closepath」で終わる場合、‘stroke-linejoin’‘stroke-linecap’の実装方法により、手動で「lineto」で閉じた場合と挙動が異なります。「closepath」ではサブパスの最後のセグメントと最初のセグメントの開始点が、現行の‘stroke-linejoin’値で「結合」されます。手動で「lineto」で閉じた場合、最初と最後のセグメントは結合されず、それぞれ現行の‘stroke-linecap’値でキャップ処理されます。 コマンド終了時、新しい現在の点は現在サブパスの初期点となります。

コマンド 名称 パラメータ 説明
Z または
z
closepath (なし) 現在のサブパスを現在のサブパスの初期点に戻して接続し閉じる(上記本文参照)。 Zzはパラメータを取らないため、効果は同一です。

閉じたサブパスは「closepath」コマンドで閉じる必要があり、これにより最初と最後のパスセグメントが結合されます。 その他のパスは開いたサブパスです。

閉じたサブパスは、終点座標が初期点である開いたサブパスとは動作が異なります。 開いたサブパスの最初と最後のパスセグメントは結合されません。最後のパスセグメントの座標がサブパスの初期点であっても、最初と最後のパスセグメントは現行のstroke-linecap値でキャップ処理され、stroke-linejoinで結合されません。

「closepath」の直後に「moveto」が続く場合、その「moveto」が次のサブパスの開始点となります。「closepath」の直後に他のコマンドが続く場合、次のサブパスは現在サブパスと同じ初期点から開始します。

9.3.4.1. セグメント完了型クローズパス操作

基本図形を等価なパスとして表現するためには、ゼロ長の直線セグメントを追加せず(仮にそのセグメントがゼロ長でも)、曲線形状を閉じる方法が必要です。 そのため、ここではセグメント完了型クローズパス操作を定義します。

セグメント完了型クローズパス操作は前のパスコマンドと合成され、2つの効果があります:

セグメント完了型クローズパス操作は現時点ではパスデータ構文のコマンドとしてはサポートされていません。 ワーキンググループは将来の仕様でその構文を提案しています。

9.3.5. 「lineto」 コマンド

各種「lineto」コマンドは現在の点から新しい点まで直線を描画します:

コマンド 名称 パラメータ 説明
L(絶対)
l(相対)
lineto (x y)+ 現在の点から指定した (x,y) 座標まで線を描き、新しい現在の点となります。 L(大文字)は絶対座標、l(小文字)は相対座標が続きます。座標ペアを複数指定すればポリラインを描画できます。コマンドの終了時、新しい現在の点は最後に指定した座標値となります。
H(絶対)
h(相対)
horizontal lineto x+ 現在の点から水平線を描画します。 H(大文字)は絶対座標、h(小文字)は相対座標が続きます。x値を複数指定可能(通常は意味がないことが多い)。Hまたはhは、y座標を0指定したLまたはlと同等です。コマンド終了時、新しい現在の点は最後の座標値となります。
V(絶対)
v(相対)
vertical lineto y+ 現在の点から垂直線を描画します。 V(大文字)は絶対座標、v(小文字)は相対座標が続きます。y値を複数指定可能(通常は意味がないことが多い)。Vまたはvは、x座標を0指定したLまたはlと同等です。コマンド終了時、新しい現在の点は最後の座標値となります。

相対 l コマンドの場合、線の終点は (cpx + x, cpy + y) です。

相対 h コマンドの場合、線の終点は (cpx + x, cpy) です。つまり h コマンドで x が正なら正のx軸方向に水平線が描かれます。

相対 v コマンドの場合、線の終点は (cpx, cpy + y) です。

9.3.6. 三次ベジエ曲線コマンド

三次ベジエコマンドは以下の通りです:

コマンド 名称 パラメータ 説明
C(絶対)
c(相対)
curveto (x1 y1 x2 y2 x y)+ 現在の点から (x,y) まで三次ベジエ曲線を描きます。(x1,y1) を曲線始点側の制御点、(x2,y2) を曲線終点側の制御点とします。 C(大文字)は絶対座標、c(小文字)は相対座標が続きます。複数座標セット指定でポリベジエが描画できます。コマンド終了時、新しい現在の点は最後に指定した (x,y) 座標ペアとなります。
S(絶対)
s(相対)
shorthand/smooth curveto (x2 y2 x y)+ 現在の点から (x,y) まで三次ベジエ曲線を描きます。最初の制御点は、前コマンドの2番目の制御点を現在の点を基準に反転した位置とみなします。(前コマンドがない場合、または C, c, S, s 以外の場合は、最初の制御点は現在の点と一致するものとします。)(x2,y2) が2番目の制御点(曲線終点側の制御点)です。 S(大文字)は絶対座標、s(小文字)は相対座標が続きます。複数座標セット指定でポリベジエが描画できます。コマンド終了時、新しい現在の点は最後の (x,y) 座標ペアとなります。

相対 c または s コマンドの場合、各座標ペアは m コマンド同様に計算します。 例えば両コマンドの曲線の終端制御点は (cpx + x, cpy + y) です。

Example cubic01 はパス内で三次ベジエコマンドを使った簡単な例を示します。 この例では内部CSSスタイルシートでスタイリングプロパティを指定しています。 "S" コマンドの制御点は、前の "C" コマンドの制御点を "S" コマンド開始点を基準に反転した位置として自動計算されることに注意してください。

<?xml version="1.0" standalone="no"?>
<svg width="5cm" height="4cm" viewBox="0 0 500 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <title>Example cubic01- cubic Bézier commands in path data</title>
  <desc>Picture showing a simple example of path data
        using both a "C" and an "S" command,
        along with annotations showing the control points
        and end points</desc>
  <style type="text/css"><![CDATA[
    .Border { fill:none; stroke:blue; stroke-width:1 }
    .Connect { fill:none; stroke:#888888; stroke-width:2 }
    .SamplePath { fill:none; stroke:red; stroke-width:5 }
    .EndPoint { fill:none; stroke:#888888; stroke-width:2 }
    .CtlPoint { fill:#888888; stroke:none }
    .AutoCtlPoint { fill:none; stroke:blue; stroke-width:4 }
    .Label { font-size:22; font-family:Verdana }
  ]]></style>

  <rect class="Border" x="1" y="1" width="498" height="398" />

  <polyline class="Connect" points="100,200 100,100" />
  <polyline class="Connect" points="250,100 250,200" />
  <polyline class="Connect" points="250,200 250,300" />
  <polyline class="Connect" points="400,300 400,200" />
  <path class="SamplePath" d="M100,200 C100,100 250,100 250,200
                                       S400,300 400,200" />
  <circle class="EndPoint" cx="100" cy="200" r="10" />
  <circle class="EndPoint" cx="250" cy="200" r="10" />
  <circle class="EndPoint" cx="400" cy="200" r="10" />
  <circle class="CtlPoint" cx="100" cy="100" r="10" />
  <circle class="CtlPoint" cx="250" cy="100" r="10" />
  <circle class="CtlPoint" cx="400" cy="300" r="10" />
  <circle class="AutoCtlPoint" cx="250" cy="300" r="9" />
  <text class="Label" x="25" y="70">M100,200 C100,100 250,100 250,200</text>
  <text class="Label" x="325" y="350"
        style="text-anchor:middle">S400,300 400,200</text>
</svg>
Example cubic01 — cubic Bézier comamnds in path data

Example cubic01

この例をSVGで表示 (SVG対応ブラウザのみ)

下記の図は、三次ベジエ曲線が制御点の位置によってどのように形状が変化するかを示します。最初の5つの例は単一の三次ベジエパスセグメントを示し、右下の例は "C" コマンドの後に "S" コマンドが続くものです。

Example cubic02 - cubic Bézier commands in path data

この例をSVGで表示 (SVG対応ブラウザのみ)

9.3.7. 二次ベジエ曲線コマンド

二次ベジエコマンドは以下の通りです:

コマンド 名称 パラメータ 説明
Q(絶対)
q(相対)
二次ベジエ曲線描画 (x1 y1 x y)+ 現在の点から (x,y) まで、(x1,y1) を制御点として二次ベジエ曲線を描きます。 Q(大文字)は絶対座標、q(小文字)は相対座標が続きます。複数座標セット指定でポリベジエが描画できます。コマンド終了時、新しい現在の点は最後の (x,y) 座標ペアとなります。
T(絶対)
t(相対)
短縮/スムース二次ベジエ曲線描画 (x y)+ 現在の点から (x,y) まで二次ベジエ曲線を描きます。制御点は前コマンドの制御点を現在の点基準で反転した位置とみなします。(前コマンドがない場合、または Q, q, T, t 以外の場合は、制御点は現在の点と一致するとみなします。)T(大文字)は絶対座標、t(小文字)は相対座標が続きます。コマンド終了時、新しい現在の点は最後の (x,y) 座標ペアとなります。

相対 q または t コマンドの場合、各座標ペアは m コマンド同様に計算します。 例えば両コマンドの曲線終端制御点は (cpx + x, cpy + y) です。

Example quad01 はパス内で二次ベジエコマンドを使った簡単な例を示します。 "T" コマンドの制御点は、前の "Q" コマンドの制御点を "T" コマンド開始点基準で反転した位置として自動計算されることに注意してください。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="6cm" viewBox="0 0 1200 600"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <title>Example quad01 - quadratic Bézier commands in path data</title>
  <desc>Picture showing a "Q" a "T" command,
        along with annotations showing the control points
        and end points</desc>
  <rect x="1" y="1" width="1198" height="598"
        fill="none" stroke="blue" stroke-width="1" />

  <path d="M200,300 Q400,50 600,300 T1000,300"
        fill="none" stroke="red" stroke-width="5"  />
  <!-- End points -->
  <g fill="black" >
    <circle cx="200" cy="300" r="10"/>
    <circle cx="600" cy="300" r="10"/>
    <circle cx="1000" cy="300" r="10"/>
  </g>
  <!-- Control points and lines from end points to control points -->
  <g fill="#888888" >
    <circle cx="400" cy="50" r="10"/>
    <circle cx="800" cy="550" r="10"/>
  </g>
  <path d="M200,300 L400,50 L600,300
           L800,550 L1000,300"
        fill="none" stroke="#888888" stroke-width="2" />
</svg>
Example quad01 — quadratic Bézier commands in path data

Example quad01

この例をSVGで表示 (SVG対応ブラウザのみ)

9.3.8. 楕円弧曲線コマンド

SVG 2 要件: SVGパス構文で円弧描画をより簡単にする。
決定: パスで円弧描画を容易にする。
目的: 著者が手作業で円弧を含むパスデータを書きやすくするため。
担当: Cameron (ACTION-3151)

楕円弧コマンドは以下の通りです:

コマンド 名称 パラメータ 説明
A(絶対)
a(相対)
楕円弧 (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ 現在の点から (x, y) まで楕円弧を描画します。楕円全体のサイズと向きは2つの半径(rx, ry)と x-axis-rotation(楕円全体の回転角度、現行座標系基準)で定義されます。楕円の中心 (cx, cy) は他のパラメータの制約条件を満たすよう自動計算されます。large-arc-flagsweep-flag は自動計算に影響し、円弧の描画方法を決定します。

相対 a コマンドの場合、円弧の終点は (cpx + x, cpy + y) です。

Example arcs01 はパス内で円弧コマンドを使った簡単な例を示します。

<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="5.25cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <title>Example arcs01 - arc commands in path data</title>
  <desc>Picture of a pie chart with two pie wedges and
        a picture of a line with arc blips</desc>
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="1" />

  <path d="M300,200 h-150 a150,150 0 1,0 150,-150 z"
        fill="red" stroke="blue" stroke-width="5" />
  <path d="M275,175 v-150 a150,150 0 0,0 -150,150 z"
        fill="yellow" stroke="blue" stroke-width="5" />

  <path d="M600,350 l 50,-25
           a25,25 -30 0,1 50,-25 l 50,-25
           a25,50 -30 0,1 50,-25 l 50,-25
           a25,75 -30 0,1 50,-25 l 50,-25
           a25,100 -30 0,1 50,-25 l 50,-25"
        fill="none" stroke="red" stroke-width="5"  />
</svg>
Example arcs01 — arc commands in path data

Example arcs01

この例をSVGで表示 (SVG対応ブラウザのみ)

楕円弧コマンドは下記の制約条件を満たす楕円の一部を描画します:

多くのケースでは、これらの制約を満たす円弧は実際には4種類(2つの楕円×2種類の弧)存在します。large-arc-flagsweep-flag は描画する円弧を次のように選択します:

下記は large-arc-flagsweep-flag の4つの組み合わせごとに描画される円弧を示します。各ケースは次のパスデータコマンドで描画します:

<path d="M 125,75 a100,50 0 ?,? 100,50"
      style="fill:none; stroke:red; stroke-width:6"/>

ここで "?,?" は "0,0"、"0,1"、"1,0"、"1,1" に置き換えて4つのケースを生成します。

Illustration of flags in arc commands

この例をSVGで表示 (SVG対応ブラウザのみ)

パスデータ楕円弧コマンドの詳細な実装ノートは 範囲外楕円弧パラメータ のセクションを参照してください。

実装ノート付録には、SVGアーク表記を中心点・弧角度方式に変換する必要があるソフトウェア向けの関連式が記載されています。

9.3.9. パスデータの文法

SVGパスデータは以下のEBNF文法に一致します。

svg_path::= wsp* moveto? (moveto drawto_command*)?

drawto_command::=
    moveto
    | closepath
    | lineto
    | horizontal_lineto
    | vertical_lineto
    | curveto
    | smooth_curveto
    | quadratic_bezier_curveto
    | smooth_quadratic_bezier_curveto
    | elliptical_arc

moveto::=
    ( "M" | "m" ) wsp* coordinate_pair_sequence

closepath::=
    ("Z" | "z")

lineto::=
    ("L"|"l") wsp* coordinate_pair_sequence

horizontal_lineto::=
    ("H"|"h") wsp* coordinate_sequence

vertical_lineto::=
    ("V"|"v") wsp* coordinate_sequence

curveto::=
    ("C"|"c") wsp* curveto_coordinate_sequence

curveto_coordinate_sequence::=
    coordinate_pair_triplet
    | (coordinate_pair_triplet comma_wsp? curveto_coordinate_sequence)

smooth_curveto::=
    ("S"|"s") wsp* smooth_curveto_coordinate_sequence

smooth_curveto_coordinate_sequence::=
    coordinate_pair_double
    | (coordinate_pair_double comma_wsp? smooth_curveto_coordinate_sequence)

quadratic_bezier_curveto::=
    ("Q"|"q") wsp* quadratic_bezier_curveto_coordinate_sequence

quadratic_bezier_curveto_coordinate_sequence::=
    coordinate_pair_double
    | (coordinate_pair_double comma_wsp? quadratic_bezier_curveto_coordinate_sequence)

smooth_quadratic_bezier_curveto::=
    ("T"|"t") wsp* coordinate_pair_sequence

elliptical_arc::=
    ( "A" | "a" ) wsp* elliptical_arc_argument_sequence

elliptical_arc_argument_sequence::=
    elliptical_arc_argument
    | (elliptical_arc_argument comma_wsp? elliptical_arc_argument_sequence)

elliptical_arc_argument::=
    number comma_wsp? number comma_wsp? number comma_wsp
    flag comma_wsp? flag comma_wsp? coordinate_pair

coordinate_pair_double::=
    coordinate_pair comma_wsp? coordinate_pair

coordinate_pair_triplet::=
    coordinate_pair comma_wsp? coordinate_pair comma_wsp? coordinate_pair

coordinate_pair_sequence::=
    coordinate_pair | (coordinate_pair comma_wsp? coordinate_pair_sequence)

coordinate_sequence::=
    coordinate | (coordinate comma_wsp? coordinate_sequence)

coordinate_pair::= coordinate comma_wsp? coordinate

coordinate::= sign? number

sign::= "+"|"-"
number ::= ([0-9])+
flag::=("0"|"1")
comma_wsp::=(wsp+ ","? wsp*) | ("," wsp*)
wsp ::= (#x9 | #x20 | #xA | #xC | #xD)

EBNFの処理では、与えられたEBNF生成式を可能な限り消費し、満たさない文字に遭遇した時点で停止します。例えば "M 100-200" の場合、"moveto" の最初の座標は "100" を消費し、生成式上で数字の後にマイナス記号は許されないため、そこで停止します。結果として最初の座標は "100"、2番目は "-200" となります。

同様に、"M 0.6.5" の場合は、"moveto" の最初の座標が "0.6" を消費し、2つ目の小数点に遭遇した時点で停止します。生成式上、座標は小数点1つしか許されないためです。結果として最初の座標は "0.6"、2番目は ".5" となります。

EBNFでは、d プロパティのパスデータ文字列が空でも許容されます。これはエラーではなく、そのパスの描画を無効化します。 d プロパティの値が none の場合も描画は無効化されます。

文法に一致しないパスデータが見つかった場合、そのパスデータはエラーです(エラー処理参照)。

9.4. パスの方向性

一部の機能、例えば マーカーの向き線端形状は、パス上のある距離、または各セグメントの開始・終了時のパスの方向によって定義されます。

指定距離におけるパスの方向は、次のように定義されます:

パスセグメントの開始方向は次の通り定義されます:

パスセグメントの終了方向は次の通り定義されます:

9.5. 実装ノート

現行標準SVGユーザーエージェントは、パスデータを利用する機能を以下の詳細に従って実装しなければなりません:

9.5.1. 範囲外楕円弧パラメータ

すべての楕円弧パラメータ(ブール値フラグ以外)は任意の数値を許容しますが、ユーザーエージェントは曲線描画や幾何計算時に無効値に対し次の修正を行う必要があります:

この寛容かつ一貫した範囲外値の扱いにより、以下が保証されます:

9.5.2. 反射制御点

S/s および T/t コマンドは、与えられた三次ベジエセグメントの最初の制御点を、前のパスセグメントの終端制御点を現在の点基準で反転して算出することを示します。正確な計算式は以下の通りです。

現在の点が (curx, cury) で、前のパスセグメントの終端制御点が (oldx2, oldy2) の場合、反転点(すなわち (newx1, newy1)、現在のパスセグメントの最初の制御点)は:

(newx1, newy1) = (curx - (oldx2 - curx), cury - (oldy2 - cury))
               = (2*curx - oldx2, 2*cury - oldy2)

9.5.3. ゼロ長パスセグメント

ゼロ長のパスセグメントは無効ではありませんが、次の場合に描画へ影響します:

9.5.4. パスデータのエラー処理

パスデータストリーム内で文法に含まれない内容(未認識内容)はエラーとなります。 この場合、以下のエラー処理規則を適用します:

9.6. パス上の距離

パス上のテキストモーションアニメーション、 各種ストローク操作などの処理では、ユーザーエージェントが path などのグラフィック要素の幾何に沿った距離を計算する必要があります。

パス上の距離を計算する正確な数学式は存在しますが、式は非常に複雑で多大な計算が必要です。オーサリングツールやユーザーエージェントはできるだけ精度の高いアルゴリズムを使うことが推奨されますが、実装差への対応や距離計算の結果が著者意図に近づくようにするために、pathLength 属性でパス全体の長さを著者が指定でき、ユーザーエージェントは pathLength の値と自身が計算したパス長の比率でパス上の距離計算をスケーリングできます。

path 要素内の「moveto」操作は0長と定義されます。実際のパス長計算には「lineto」「curveto」「arcto」命令のみが寄与します。

9.6.1. ‘pathLength’ 属性

名前 初期値 アニメーション可能
pathLength <number> (なし) はい

パス全体の長さをユーザー単位で著者が計算した値です。この値はユーザーエージェントの パス上の距離計算を著者の値で較正するために使用されます。ユーザーエージェントは pathLength の値と自身が計算したパス長の比率で 全てのパス上の距離計算をスケーリングします。pathLengthパス上のテキストモーションアニメーション、 各種ストローク操作の計算に影響します。

0の値も有効で、無限大のスケーリング係数として扱われます。0を無限大でスケーリングしても0のままですが、0より大きい非パーセンテージ値は +Infinity になります。

負の値はエラーです(エラー処理参照)。

pathLength は パーセンテージによる パス上の距離計算には効果がありません。

9.7. DOMインターフェース

9.7.1. インターフェース SVGPathElement

SVGPathElement オブジェクトは、DOM内の path を表します。

[Exposed=Window]
interface SVGPathElement : SVGGeometryElement {
};