13.3.5 折線 (polyline)
折線を作成するために使用します
polyline 要素
折線を作成する際に使用する。
属性
属性名 属性値 説明 必須
points 座標 空白区切りの、折れ線の各頂点の座標(x, y)列 ○
fill-rule 塗りつぶし ×
nonzero 閉じた領域注1 を全面塗りつぶす(規定値)
evenodd 閉じた領域を規則注2 に従って塗り分ける
注1)polyline の場合も最後の頂点から最初の頂点に線が引かれていると考えます。
注2)領域内から外に向かって線を引いて、折線と交わるのが奇数本ならば塗りつぶす。
記述例
<svg viewbox = "0 0 400 110" width = "400" height = "110" >
<polyline points = "30,10 10,30 110,30 60,50 60,10" stroke = "blue" fill = "none" />
<polyline points = "30,60 10,80 110,80 60,100 60,60" fill = "blue" />
<polyline points = "150,10 130,30 230,30 180,50 180,10" stroke = "blue" fill = "yellow" fill-opacity = "0.2"
stroke-width = "5" />
<polyline points = "150,60 130,80 230,80 180,100 180,60" stroke = "gray" fill = "blue" fill-opacity = "0.2"
stroke-width = "5" stroke-dasharray = "10 2" />
</svg>
左側は枠のみ、塗りつぶしのみです。2列目はいろいろです。
fill-rule 属性を指定することによって、塗り分けことができます。
記述例
<svg viewbox = "0 0 400 120" width = "400" height = "120" >
<polyline points = "10,30 110,30 110,130, 10,130 85,55 100,120 30,50" stroke = "black" fill = "lightgreen"
fill-rule = "nonzero" /> 全面
<polyline points = "150,30 250,30 250,130, 150,130 225,55 240,120 170,50" stroke = "black" fill = "lightgreen"
fill-rule = "evenodd" /> 塗り分け
</svg>
左側は全面を塗りつぶしていて、右側は塗り分けています。塗り分けは、折れ線で囲まれた領域内から外に向かって線を引いて、交わる折れ線が奇数本ならば塗りつぶし、そうでないなら塗りつぶさないという方式で行われています。
13.3.6 多角形 (polygon)
多角形を作成するために使用します。
polygon 要素
多角形を作成する際に使用する。
属性
属性名 属性値 説明 必須
points 座標 空白区切りの、折れ線の各頂点の座標(x, y)列 (最後の頂点から最初の頂点に線が引かれる) ○
fill-rule 塗りつぶし ×
nonzero 閉じた領域を全面塗りつぶす(規定値)
evenodd 閉じた領域を規則注1 に従って塗り分ける
注1)領域内から外に向かって線を引いて、折線と交わるのが奇数本ならば塗りつぶす。
記述例
<svg viewbox = "0 0 400 110" width = "400" height = "110" >
<polygon points = "30,10 10,30 110,30 60,50 60,10" stroke = "blue" fill = "none" />
<polygon points = "30,60 10,80 110,80 60,100 60,60" fill = "blue" />
<polygon points = "150,10 130,30 230,30 180,50 180,10" stroke = "blue" fill = "yellow" fill-opacity = "0.2"
stroke-width = "5" />
<polygon points = "150,60 130,80 230,80 180,100 180,60" stroke = "gray" fill = "blue" fill-opacity = "0.2"
stroke-width = "5" stroke-dasharray = "10 2" />
</svg>
左側は枠のみ、塗りつぶしのみです。2列目はいろいろです。
fill-rule 属性を指定することによって、塗り分けことができます。
記述例
<svg viewbox = "0 0 400 120" width = "400" height = "120" >
<polygon points = "10,30 110,30 110,130, 10,130 85,55 100,120 30,50" stroke = "black" fill = "lightgreen"
fill-rule = "nonzero" /> 全面
<polygon points = "150,30 250,30 250,130, 150,130 225,55 240,120 170,50" stroke = "black" fill = "lightgreen"
fill-rule = "evenodd" /> 塗り分け
</svg>
左側は全面を塗りつぶしていて、右側は塗り分けています。塗り分けは、折れ線で囲まれた領域内から外に向かって線を引いて、交わる折れ線が奇数本ならば塗りつぶし、そうでないなら塗りつぶさないという方式で行われています。
13.3.7 パス (path)
パスデータによって図形を作成します。
path 要素
パスデータによって図形を作成する。
属性
属性名 属性値 説明 必須
d パスデータ 空白区切りのコマンド群 ○
pathlength 数値 パスの形式的な全長(stroke-dashoffsetやstroke-dasharray属性等はこの値を基準として描画される) ×
fill-rule 塗りつぶし ×
nonzero 閉じた領域を全面塗りつぶす(規定値)
evenodd 閉じた領域を規則注1 に従って塗り分ける
注1)領域内から外に向かって線を引いて、折線と交わるのが奇数本ならば塗りつぶす。
パスデータ
コマンド 引数 説明
M、m x,y (x, y) を現在の座標とする
Z、z (なし) コマンド M で指定した座標まで直線を引いて図形を閉じる
L、l x,y 現在の座標から、(x, y) へ直線を引く
H、h x 現在の座標から、x まで水平線を引く
V、v y 現在の座標から、y まで垂直線を引く
A、a rx,ry r l s x,y 現在の点から点 (x, y) へ半径 (rx, ry) の楕円形の弧を引く
Q、q x1,y1 x,y (x1, y1) を用いて点 (x, y) へ二次ベジェ曲線を引く
T、t x,y 現在の点から (x, y) へ二次ベジェ曲線を引く
C、c x1,y1 x2,y2 x,y 現在の座標から、(x1, y1) と (x2, y2) を用いて (x, y) へ三次ベジェ曲線を引く
S、s x2,y2 x,y 前の (x2, y2) の点対称の地点と (x2, y2) を用いて (x, y) へ三次ベジェ曲線を引く
○座標は、コマンドが大文字のときは絶対位置(左上点からの位置)、小文字のときは相対位置(前の座標からの位置)
○引数の区切りは、空白でもカンマ(,)でもよい。また、コマンド間の区切りは空白だがなくてもよい。
(1) 初期位置 (M、m)
Mx,y
(x, y) が、開始点となる座標(現在の座標)として新しく設定されます。パスデータの途中に出現した場合はそこで部分パスが区切られ、別の図形となります。
M は、絶対位置(左上点からの位置)、m は、相対位置(前の座標からの位置)です。
記述例
<svg viewbox = "0 0 400 100" width = "400" height = "100" >
<path d = "M10,10" /> これだけでは何も表示されない
</svg>
(2) 終了 (Z、z)
Z
現在の部分パスの終了を意味し、現在の点から現在の部分パスの始点(M、m で指定した座標)への直線が自動的に描かれます。
記述例
<svg viewbox = "0 0 400 100" width = "400" height = "100" >
<path d = "M10,10 Z" /> これだけでは何も表示されない
</svg>
(3) 直線 (L、l)
Lx,y
現在の座標から (x, y) まで直線が描かれます。
L は、絶対位置(左上点からの位置)、l は、相対位置(前の座標からの位置)です。
記述例
<svg viewbox = "0 0 400 100" width = "400" height = "100" >
<path d = "M10,10 L110,10 l0,50 Z" stroke = "blue" fill = "lightgreen" />
</svg>
(10, 10)-(110, 10)-(110, 60)-(10, 10) のように直線を引きます。
(4) 水平線 (H、h)
Hx
現在の座標から水平に x 座標まで直線が描かれます。
H は、絶対位置(左上点からの位置)、h は、相対位置(前の座標からの位置)です。
記述例
<svg viewbox = "0 0 400 50" width = "400" height = "50" >
<path d = "M10,10 H110 M10,40 h100" stroke = "blue" />
</svg>
(10, 10)-(110, 10) と (10, 40)-(110, 40) のように直線を引きます。
(5) 垂直線 (V、v)
Vy
現在の座標から垂直に y 座標まで直線が描かれます。
V は、絶対位置(左上点からの位置)、v は、相対位置(前の座標からの位置)です。
記述例
<svg viewbox = "0 0 400 120" width = "400" height = "120" >
<path d = "M10,10 V110 M40,10 v100" stroke = "blue" />
</svg>
(10, 10)-(10, 110) と (40, 10)-(40, 110) のように直線を引きます。
(6) 円弧 (A、a)
A rx,ry r l s x,y
現在の座標から、半径 (rx, ry) の楕円が (x, y) まで描かれます。ただし、
r (x-axis-rotation) : 軸を傾ける角度(度)
l (large-arc-flag) : 弧の選択(0:短いほうの弧、1:長いほうの弧)
s (sweep-flag) : 向きの選択(0:反時計回り、1:時計回り)
A は、絶対位置(左上点からの位置)、a は、相対位置(前の座標からの位置)です。
円弧の傾けたい場合は、x-axis-rotation に傾ける角度(度)を指定します。
記述例
<svg viewbox = "0 0 400 200" width = "400" height = "200" >
<path d = "M10,215 L60,165 A30,50 0 0 1 112,112 L122,102 A30,50 -45 0 1 165,60 L215,10"
stroke = "blue" fill = "none" />
</svg>
一つ目(左側)の円弧は x-axis-rotation が 0 なので円弧が通る楕円が直立しています。それに対して二つ目(右側)の円弧は x-axis-rotation が -45 度になっていますので、左に 45度回転されて描かれています。 なお、グレイの点線は理解の助けになるように別途描いています。
円弧は直線と違い、開始点と終了点を指定しただけでは図形が一意に決まりません。large-arc-flag と sweep-flag を指定することによりどう描くかを指定します。
記述例
<svg viewbox = "0 0 400 200" width = "400" height = "200" >
<path d = "M30,30 A30,30 0 0 0 60,60" stroke = "blue" stroke-width = "3" fill = "none" /> 短い弧、反時計回り
<path d = "M230,30 A30,30 0 0 1 260,60" stroke = "blue" stroke-width = "3" fill = "none" /> 短い弧、時計回り
<path d = "M30,130 A30,30 0 1 0 60,160" stroke = "blue" stroke-width = "3" fill = "none" /> 長い弧、反時計回り
<path d = "M230,130 A30,30 0 1 1 260,160" stroke = "blue" stroke-width = "3" fill = "none" /> 長い弧、時計回り
</svg>
(30, 30)-(60, 60) のように左上から右下に向かって描いています。large-arc-flag と sweep-flag の指定により次のように描画されます。 なお、グレイの点線などは理解の助けになるように別途描いています。
表示例
短い弧、反時計回り
短い弧、時計回り
長い弧、反時計回り
長い弧、時計回り
(7) 二次ベジェ曲線 (Q、q、T、t)
制御点を 1 つだけ必要とし、始点(現在の座標)側と終点 (x, y) 側両方の曲線の傾斜を定義します。
Q や q の場合は (x1, y1) でその制御点を与えますが、T や t の場合は開始点を中心に前の制御点の点対称の位置を新しい制御点とします(略式 二次ベジェ曲線とも呼ばれています)。
Q x1,y1 x,y
T x,y
記述例
<svg viewbox = "0 0 400 180" width = "400" height = "180" >
<path d = "M50,10 Q100,160 150,110 T250,110" stroke = "blue" fill = "none" stroke-width = "3" />
</svg>
● (50,10) から ● (100,160) を制御点にして ● (150,110) まで曲線を引いています。そのあと、● (150,110) を中心に ● (100,160) の点対象の位置 ● (200,60) を次の制御点にして引き続き ● (150,110) から ● (250,110) まで曲線を引いています。 なお、グレイの破線や色の薄い図形などは理解の助けになるように別途描いています。
表示例
M50,10
150,110
Q100,160
T250,110
(200,60)
2次ベジェ曲線で描くとしても、適切な制御点を見つけるのは簡単ではありません。そこで簡易的な2つの方法で描いてみます。
ポイントを一つ置きに曲線の通る点と制御点にする
ポイントの中点を曲線の通る点とし、ポイントを制御点にする
ポイント X 座標 Y 座標
1 90 45
2 75 30
3 45 30
4 20 45
5 45 65
6 65 75
7 45 90
8 30 105
9 45 113
10 75 120
11 90 105
12 110 70
なお、グレイの線はポイントを直線で結んだ場合の図形です。
(8) 三次ベジェ曲線 (C、c、S、s)
制御点を 2 つにして、始点(現在の座標)側と終点 (x, y) 側両方の曲線の傾斜を定義します。
C や c の場合は (x1, y1) と (x2, y2) でその制御点を与えますが、S や s の場合は2つ目の制御点は指定しますが、1つ目の制御点は開始点を中心に前の制御点の点対称の位置とします(略式 三次ベジェ曲線とも呼ばれています)。
C x1,y1 x2,y2 x,y
S x2,y2 x,y
記述例
<svg viewbox = "0 0 420 180" width = "420" height = "180" >
<path d = "M50,10 C170,60 60,160 200,160 S350,110 250,60" stroke = "blue" fill = "none" stroke-width = "3" />
</svg>
● (50,10) から ● (170,60) と ● (60,160) を制御点にして ● (200,160) まで曲線を引いています。そのあと、● (200,160) を中心に ● (60,160) の点対象の位置 ● (340,160) を次の1つ目の制御点にして、指定されている2つ目の制御点 ● (350,110) とで引き続き ● (200,160) から ● (250,60) まで曲線を引いています。 なお、グレイの破線や色の薄い図形などは理解の助けになるように別途描いています。
表示例
M50,10
C170,60
60,160
200,160
(340,160)
S350,110
250,60
fill-rule 属性を指定することによって、全面塗りつぶすか、塗り分けをするかを指定することができます。
evenodd(塗り分け)は、d で指定された線で囲まれた領域内から外に向かって線を引いて、交わる線が奇数本ならば塗りつぶし、そうでないなら塗りつぶさないという方式で行われています。
nonzero(全面塗りつぶし)の場合は基本的にすべてを塗りつぶしますが、左下の例のように nonzero であっても塗りわけが行われることがあります。
交わる線の向きが左から右のものと右から左のものとが同数のときは塗りつぶされません。
矢印は d で指定された線の描かれる向きです。別途描いています。
記述例
<svg viewbox = "0 0 600 240" width = "600" height = "240" >
<path d = "M110,30 L190,30 L190,170 L110,170 Z
M130,70 A20,20 0 0 1 170,70 A20,20 0 0 1 130,70
M130,130 A20,20 0 0 0 170,130 A20,20 0 0 0 130,130"
stroke = "black" fill = "lightgreen" fill-rule = "nonzero" />
<path d = "M210,30 L290,30 L290,170 L210,170 Z
M230,70 A20,20 0 0 1 270,70 A20,20 0 0 1 230,70
M230,130 A20,20 0 0 0 270,130 A20,20 0 0 0 230,130"
stroke = "black" fill = "lightgreen" fill-rule = "evenodd" />
</svg>
表示例
nonzero
evenodd
同じ向き
異なる向き
真ん中に穴を開けて背景が表示されるようにすることもできます。
記述例
<svg viewbox = "0 0 400 100" width = "400" height = "100" >
<image x = "300" y = "10" width = "64" height = "64" xlink:href = "bear.png" />
<path d = "M100,10 L174,10 L174,74 L100,74 Z M160,70 A25,35 0 1 0 120,70 Z" fill = "blue" fill-rule = "evenodd" />
</svg>