1. 長方形の描き方
※長方形のことを英語でrectangleという(略してrect).長方形はrectで描く.<svg width=".." height=".." viewBox="x y w h" xmlns="http://www.w3.org/2000/svg"></svg>において,長方形の書き方の基本は次の通りです.
(A) 座標と縦横の他もrectの要素として書き並べる方法
以下は,<svg width="100" height="200" viewBox="0 0 10 20" ...での例とする.<rect x=".." y=".." width=".." height=".." stroke="color1" stroke-width=".." fill="color2" /> (B) 座標と縦横の他はstyle属性として書き並べる方法 <rect x=".." y=".." width=".." height=".." style="stroke:color1; stroke-width:..; fill:color2;" /> (A)(B)とも(x,y)はビューポートでの左上のx座標とy座標,widthは横幅,heightは縦幅を指定します. strokeは輪郭線の色,stroke-widthは輪郭線の幅,fillは塗りつぶしの有無を表します. 左上端が(2,1),右下端が(2+5,1+3)の緑の長方形に対して,輪郭線の幅が1となってるので,長方形の内側の緑色の部分は(2.5, 1.5)から(6.5, 3.5)まで,黒の輪郭線の外側は(1.5, 0.5)から(7.5, 4.5)までです. この他,輪郭線には実線,鎖線,1点鎖線などの属性をstroke-dasharrayで指定できます.またstroke,fillとも不透明度の属性をopacityで指定できます.opacityは「不透明度」すなわち透明度の逆でopacity:1;が塗りつぶしのまま,opacity:0;が透明で,この間の小数値を自由に指定できます.
(A)の書き方では次の例のように書き足す.
stroke-dasharray="0.2 0.2" stroke-opacity="0.5" fill-opacity="0.3" (B)の書き方では次の例のように書き足す. styleの中にstroke-dasharray:0.2 0.2; stroke-opacity:0.5; fill-opacity:0.3; |
2. 楕円の描き方
※楕円のことを英語でellipse(エリプス…「リ」にアクセントがある)という.楕円はellipseで描く.<svg width=".." height=".." viewBox="x y w h" xmlns="http://www.w3.org/2000/svg"></svg>において,楕円の書き方の基本は次の通りです.
(A) 中心の座標(cx, cy),横半径rx,縦半径ryの他もellipseの要素として書き並べる方法
<ellipse cx=".." cy=".." rx=".." ry=".." stroke="color1" stroke-width=".." fill="color2" /> (B) 中心の座標(cx, cy),横半径rx,縦半径ryの他はstyle属性として書き並べる方法 <ellipse cx=".." cy=".." rx=".." ry=".." style="stroke:color1; stroke-width:..; fill:color2;" /> 楕円の中心は(5, 2.5)横の半径は4,縦の半径は2なので横長の楕円です. 輪郭線は赤,輪郭線の太さはビューポートのスケールで0.2,楕円の内部は銀色で塗りつぶされます. 楕円の中心は(5, 5)横の半径は3,縦の半径は4なので縦長の楕円です. 輪郭線は黒,輪郭線の太さはビューポートのスケールで0.3,楕円の内部は塗りつぶされず透明です. この他,輪郭線には実線,鎖線,1点鎖線などの属性をstroke-dasharrayで指定できます.またstroke,fillとも不透明度の属性をopacityで指定できます.opacityは「不透明度」すなわち透明度の逆でopacity:1;が塗りつぶしのまま,opacity:0;が透明で,この間の小数値を自由に指定できます.
(A)の書き方では次の例のように書き足す.
stroke-dasharray="0.2 0.2" stroke-opacity="0.5" fill-opacity="0.3" (B)の書き方では次の例のように書き足す. styleの中にstroke-dasharray:0.2 0.2; stroke-opacity:0.5; fill-opacity:0.3; <ellipse cx="5" cy="4" rx="4" ry="2.5" style="stroke:blue;stroke-dasharray:0.4 0.2;stroke-opacity:0.7;stroke-width:0.3; fill:#00ffff;fill-opacity:0.3;" /> <ellipse cx="5" cy="7" rx="4" ry="2.5" style="stroke:red;stroke-dasharray:0.4 0.2;stroke-opacity:0.7;stroke-width:0.3; fill:#ff0000;fill-opacity:0.2;" /> の場合です. 後から描いた赤の楕円の不透明度を低くしているので,青の楕円が透けて見えます. |
3. 折れ線の描き方
lineで描ける直線を次々につないでいけば折れ線を描けますが,次に述べるpolylineを使うともっと簡単に描くことができます.
<svg width=".." height=".." viewBox="x y w h" xmlns="http://www.w3.org/2000/svg"></svg>において,楕円の書き方の基本は次の通りです.なお,stroke, stroke-width, fillなどを,(A)折れ線の要素として並べる,(B)styleの属性として並べる,の書き方は前の2つの例と同様にどちらも可能です.
◎(C1) 点の座標を x1,y1 x2,y2,..と書き並べる方法
<polyline points="x1,y1 x2,y2 ..." /> ◎(C2) 点の座標を x1 y1, x2 y2,..と書き並べる方法 <polyline points="x1 y1, x2 y2, ..." /> 〇(C3) 点の座標を x1 y1 x2 y2,..と書き並べる方法 <polyline points="x1 y1 x2 y2 ..." /> 〇(C4) 点の座標を x1,y1,x2,y2,..と書き並べる方法 <polyline points="x1,y1,x2,y2,..." />
半角スペースも半角カンマも区切り文字として同じように扱われるので,(C1)から(C4)はどれも同じ結果になります.
ただし,「数字が奇数個になってしまった場合」「最後がカンマで終わっている場合」はエラーになりますから,x座標とy座標の対が見やすく,間違いにくい書き方が有利です.その点から言えば(C1)または(C2)のように書くのがよいでしょう. なお,fill="none"もしくはstyle="fill:none;"の記述を忘れると,始点と終点を結んだ多角形として中が塗りつぶされますので,折れ線にするには「必ずfillをnoneにする」と決める方がよい. <polyline points="0.000,0.000 0.314,0.309 0.628,0.588 0.942,0.809 1.257,0.951 1.571,1.000 1.885,0.951 2.199,0.809 2.513,0.588 2.827,0.309 3.142,0.000 3.456,-0.309 3.770,-0.588 4.084,-0.809 4.398,-0.951 4.712,-1.000 5.027,-0.951 5.341,-0.809 5.655,-0.588 5.969,-0.309 6.283,0.000" style="stroke:blue;stroke-width:0.05;fill:none;" /> |
4. 多角形の描き方
四角形tetragon,五角形pentagon,六角形hexagon,…のように接尾語のgonを付けると,「..角形」になります.これらの総称が多角形polygonです.<svg width=".." height=".." viewBox="x y w h" xmlns="http://www.w3.org/2000/svg"></svg>において,多角形の書き方の基本は次の通りです. なお,stroke, stroke-width, fillなどを,(A)折れ線の要素として並べる,(B)styleの属性として並べるの書き方,および,カンマで区切ってもスペースで区切っても同じという事情は前の例と同様です.
<polygon points="x1,y1 x2,y2 ..." />
3)は<polygon points="2,2 2,8 8,2 8,8" style="stroke:blue;stroke-width:0.1;fill:aqua;fill-rule:nonzero;" />としたもので,fill-rule:nonzero;は各点から半直線を伸ばして無限の彼方に向かったとき,1回でも多角形と交わる点は内部としてfillのcolorで塗るというルールです.fill-ruleの記述が省略された場合もnonzeroになります. |
5. 角なし長方形(丸い長方形,角丸四角形)の描き方
長方形rectの要素にrx,ryを付け加えると,角が丸い長方形が描けます.このrx,ryは楕円のときに使った横方向の半径,縦方向の半径です. |
6. <path>による多角形や弧の描き方
<path>を使うと,直線,長方形,円などの基本図形に限られず,もっと一般的な線が描けます.次の例では,<svg width="100" height="100" viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg">により,描画領域100×100に(0,0)〜(10,10)のビューポートを投影しています.ビューポート座標を見やすくするために縦横の方眼線を書き込んでいるが,これは解説の中身には関係しません.
(1)は
<path d="M 5,1 L 1,3 L 1,7 L 5,9 L 9,7 L 9, 3" style="stroke:red;stroke-width:0.2;" />と書いたもので,<pathで始まり,/>で終わる. d=".."はdataという意味だと言われている. コマンドのMはmovetoの略で,続く2つの数字(カンマ区切りでもスペース区切りでもよい)が新しいパスの始点を示す.現在地がどこであっても,その点までは,ペンを上げて移動するだけになる. Lはlinetoの略と考えればよく,続く2つの数字まで線が引かれる. なお,(1)のように書くと,polygonで書いた時と同様に,規定値のblackで塗りつぶされます.
(2)は
<path d="M 5,1 L 1,3 L 1,7 L 5,9 L 9,7 L 9, 3" style="stroke:red;stroke-width:0.2;fill:none;" />と書いたもので,塗りつぶしはありません. (1)(2)において大文字のM, Lの後の座標はビューポート座標を直接指定したもの(絶対座標)と解釈されます.これに対して小文字のm, lで書いたとき,後の座標は相対的な移動量と解釈されます.次の例(3)は(2)と同じ内容を相対座標で書いたものです.
(3)は
<path d="M 5,1 l -4,2 l0,4 l 4,2 l 4,-2 l 0,-4" style="stroke:red;stroke-width:0.2;fill:none;" />としたもので,先頭のMだけは大文字でも小文字でも絶対座標と解されますが,途中のコマンドでは,小文字のm, lは相対移動量を表します.(小文字のlと数字の1の区別が分かり易いようにイタリック体で示した.)
(4)は<path d="M 5,1 1,7 5,9 9,7 Z" style="stroke:blue;stroke-width:0.2;fill:none;" />としたもので,Zはclosepathを表し,Mで始まったパスの始点まで戻って閉じた線にする.
もちろん,最後に始点の座標を再度書けば「ほぼ」同じ結果が得られる.
(5)は<path d="M 5,1 1,7 5,9 9,7 5,1" style="stroke:blue;stroke-width:0.2;fill:none;" />としたもので,(4)のZコマンドによるclosepathの代わりに,始点の座標を再度書いたもので,(4)と「ほぼ」同じになるが,strokeが太い場合に,始点,終点が微妙に違う.始点を中心として両側に幅を付けた直線に対して,終点を重ねても「幅の外側の部分が欠けるため,閉じた多角形と少し違うものになる」.
x軸方向だけの移動,y軸方向だけの移動の場合は,短縮記号が使えます.H nでy座標を変えずにx座標だけnに移動する絶対移動,小文字の場合はh nでy座標を変えずにx座標だけn増加(減少)する相対移動を表し,V nでx座標を変えずにy座標だけnに移動する絶対移動,小文字の場合はv nでx座標を変えずにy座標だけn増加(減少)する相対移動を表します.縦または横移動が多いときはこちらが有利です.
(6)は<path d="M 5,1 V 2 H 3 v 4 h 5 Z" style="stroke:green;stroke-width:0.2;fill:none;" />としたもので,
ここまでは,lineやpolygonなどでもできるものですが,以下の「円弧」「楕円弧」は,pathで描けます.弧は,
<path d="M x1,y1 A rx,ry θ af sf x2,y2" /> の形で書き,M x1,y1で弧の開始点を表し,A(Arc)と書かれたらそこからは直線ではなくて弧を描くための7個の変数が並びます. rx,ryで楕円のx半径,y半径を表す.θは楕円全体を回転させる角度を表すがこれは,ここ4つの例ではθ=0のものを扱う.次のafは劣弧(0),優弧(1)の区別を,sfは「反時計回りの向き(0)」に描いていくか「時計回りの向き(1)」に描いていくかを表し,最後のx2,y2が弧の終点の座標になります.
※時計回り,反時計回りの向きsweep-flag:sfについては,デフォルトの設定(xは右が正の向き,yは下が正の向き)で分かり易いように「時計」「反時計」で書きましたが,詳しくは下記の(13)参照
<path d="M 3,5 A 3,2 0 0 0 6,7" style="stroke:red;stroke-width:0.2;fill:none;" />
劣弧(0)は赤と青,そのうち反時計回り(0)は赤の弧 <path d="M 3,5 A 3,2 0 1 0 6,7" style="stroke:green;stroke-width:0.2;fill:none;" /> 優弧(1)は緑とオレンジ,そのうち反時計回り(0)は緑の弧 <path d="M 3,5 A 3,2 0 0 1 6,7" style="stroke:blue;stroke-width:0.2;fill:none;" /> 劣弧(0)は赤と青,そのうち時計回り(1)は青の弧 <path d="M 3,5 A 3,2 0 1 1 6,7" style="stroke:orange;stroke-width:0.2;fill:none;" /> 優弧(1)は緑とオレンジ,そのうち時計回り(1)はオレンジの弧
Aから3個目の数字は,楕円をx軸に対して回転させる角度を表します.左の図はいずれも回転角30°の楕円です.
<path d="M 3,5 A 3,2 30 0 0 6,7" style="stroke:red;stroke-width:0.2;fill:none;" /> 劣弧(0)は赤と青,そのうち反時計回り(0)は赤の弧 <path d="M 3,5 A 3,2 30 0 1 6,7" style="stroke:green;stroke-width:0.2;fill:none;" /> 優弧(1)は緑とオレンジ,そのうち反時計回り(0)は緑の弧 <path d="M 3,5 A 3,2 30 1 0 6,7" style="stroke:blue;stroke-width:0.2;fill:none;" /> 劣弧(0)は赤と青,そのうち時計回り(1)は青の弧 <path d="M 3,5 A 3,2 30 1 1 6,7" style="stroke:orange;stroke-width:0.2;fill:none;" /> 優弧(1)は緑とオレンジ,そのうち時計回り(1)はオレンジの弧
半円の例
(9) 下半円<path d="M 2,5 A 3,3 0 0 0 8,5" style="stroke:red;stroke-width:0.2;fill:none;" /> 上半円<path d="M 2,5 A 3,3 0 0 1 8,5" style="stroke:green;stroke-width:0.2;fill:none;" /> (10) 左半円<path d="M 5,2 A 3,3 0 0 0 5,8" style="stroke:blue;stroke-width:0.2;fill:none;" /> 右半円<path d="M 5,2 A 3,3 0 0 1 5,8" style="stroke:orange;stroke-width:0.2;fill:none;" /> (11) 4分円 <path d="M 2,5 A 3,3 0 0 1 5,2" style="stroke:red;stroke-width:0.2;fill:none;" /> <path d="M 2,5 A 3,3 0 0 0 5,2" style="stroke:darkred;stroke-width:0.2;fill:none;" /> <path d="M 2,5 A 3,3 0 0 0 5,8" style="stroke:green;stroke-width:0.2;fill:none;" /> <path d="M 2,5 A 3,3 0 0 1 5,8" style="stroke:#003300;stroke-width:0.2;fill:none;" /> <path d="M 5,2 A 3,3 0 0 1 8,5" style="stroke:blue;stroke-width:0.2;fill:none;" /> <path d="M 5,2 A 3,3 0 0 0 8,5" style="stroke:darkblue;stroke-width:0.2;fill:none;" /> <path d="M 5,8 A 3,3 0 0 0 8,5" style="stroke:orange;stroke-width:0.2;fill:none;" /> <path d="M 5,8 A 3,3 0 0 1 8,5" style="stroke:tomato;stroke-width:0.2;fill:none;" /> (12) 上記の4分円を点(5,5)を中心に45°回転したもの <path d="M 2,5 A 3,3 0 0 1 5,2" transform="rotate(45 5,5)" style="stroke:red;stroke-width:0.2;fill:none;" /> <path d="M 2,5 A 3,3 0 0 0 5,2" transform="rotate(45 5,5)" style="stroke:darkred;stroke-width:0.2;fill:none;" /> <path d="M 2,5 A 3,3 0 0 0 5,8" transform="rotate(45 5,5)" style="stroke:green;stroke-width:0.2;fill:none;" /> <path d="M 2,5 A 3,3 0 0 1 5,8" transform="rotate(45 5,5)" style="stroke:#003300;stroke-width:0.2;fill:none;" /> <path d="M 5,2 A 3,3 0 0 1 8,5" transform="rotate(45 5,5)" style="stroke:blue;stroke-width:0.2;fill:none;" /> <path d="M 5,2 A 3,3 0 0 0 8,5" transform="rotate(45 5,5)" style="stroke:darkblue;stroke-width:0.2;fill:none;" /> <path d="M 5,8 A 3,3 0 0 0 8,5" transform="rotate(45 5,5)" style="stroke:orange;stroke-width:0.2;fill:none;" /> <path d="M 5,8 A 3,3 0 0 1 8,5" transform="rotate(45 5,5)" style="stroke:tomato;stroke-width:0.2;fill:none;" /> |
※<path d="M x1,y1 A rx,ry θ af sf x2,y2" /> の,Aから5番目のパラメーターsfについて
次の図は,<svg width="100" height="100" viewBox="-5 -5 10 10" xmlns="http://www.w3.org/2000/svg">のように,ビューポートが(−5,−5)-(5,5)に設定された座標について,y座標の向きがデフォルト(下が正)の場合と,数学座標に合わせてy座標の向きを上が正scale(1,−1)に設定した場合の角度の向きを調べたものです.
seep-flag:sfを「x軸の正の向きから,y軸の正の向きへ,小さい方の角で回る向きを【正の向きsf=1】とし,その逆を【負の向きsf=0】とする」と
赤で示した弧は,デフォルトの設定で下がy座標の正となるようにしたもので <path d="M 3,0 A 3,3 0 0 1 0,3" style="stroke:red;stroke-width:0.2;fill:none;" />により,3,0から0,3へ劣弧にそって正の向きに回った0 1ことになります. 青で示した弧は,scale(1,−1)により数学座標に合わせて上向きがyの正の向きにしたもので <path d="M 3,0 A 3,3 0 0 1 0,3" transform="scale(1,-1)" style="stroke:blue;stroke-width:0.2;fill:none;" />により,3,0から0,3へ劣弧にそって正の向きに回った0 1ことになります. ただし,3,0から0,3は,transform="scale(1,-1)"で変換された後の位置です.
このようにして,large-arc-flag:afとsweep-flag:sfは,いずれも,小さい方(劣弧,負の角)で0,大きい方(優弧,正の角)で1と覚えると統一的に理解できるようです.
ただし,正の角,負の角は,画面上の時計回り,反時計回りと視覚的に結びつけるのでなく,x軸の正の向きからy軸の正の向きへ回る角が正とします. また,変換transformがあるときは,始点,終点の位置は,変換後の位置を表すことが重要です.
(14)はビューポートを(−5,−5)〜(5,5)に設定したものです.
緑の線はtransform= "scale(1,-1)"によるy座標の上下逆転(数学座標と一致)後の点の座標で,(3,0)から(0,3)へ,半径rx=3,ry=3の円に沿って,優弧(1)を負の向き(0)に回ったと解釈できます. <path d="M 3,0 A 3,3 0 1 0 0,3" transform= "scale(1,-1)" style= "stroke:green; stroke-width:0.2; fill:none;" /> オレンジの線はtransform= "scale(1,−1)"によるy座標の上下逆転(数学座標と一致)後の点の座標で,(3,0)から(0,3)へ,半径rx=3,ry=3の円に沿って,優弧(1)を正の向き(1)に回ったと解釈できます. <path d="M 3,0 A 3,3 0 1 1 0,3" transform= "scale(1,-1)" style= "stroke:orange; stroke-width:0.2; fill:none;" />
(15)はビューポートを(−5,−5)〜(5,5)に設定したものです.
<path d="M 2,0 A 2,2 0 1 0 0,2" transform="translate(-2,1) scale(1,-1)" style="stroke:red;stroke-width:0.2;fill:none;" /> scale(1,-1)により座標軸の上下の符号を逆にしてから,translate(-2,1)により左に2,下に1(scaleとは無関係に下を正として1)平行移動する.変換した後の座標で(2,0)〜(0,2)が始点と終点になる.この2点を含む半径rx=2,ry=2の円周上の優弧(1)を負の向き(0)--scale(1,-1)の結果,時計回り--に回る.(暗赤色は正の向き(1)に回った場合) <path d="M 2,0 A 2,2 0 1 0 0,2" transform="scale(1,-1) translate(-2,1)" style="stroke:red;stroke-width:0.2;fill:none;" /> translate(-2,1)により座標系を左に2,下に1移動してから,上下の符号を逆にする.その新座標で(2,0)〜(0,2)が始点と終点になる.この2点を含む半径rx=2,ry=2の円周上の優弧(1)を負の向き(0)--scale(1,-1)の結果,時計回り--に回る.(灰色の弧は正の向きに回った場合) <path d="M 2,0 A 2,2 0 1 1 0,2" transform="translate(-1,2) scale(1,-1)" style="stroke:green;stroke-width:0.2;fill:none;" /> scale(1,-1)により座標軸の上下の符号を逆にしてから,translate(-1,2)により左に1,下に2(scaleとは無関係に下を正として2)平行移動する.変換した後の座標で(2,0)〜(0,2)が始点と終点になる.この2点を含む半径rx=2,ry=2の円周上の優弧(1)を負の向き(0)--scale(1,-1)の結果,反時計回り--に回る.(暗赤色は正の向き(1)に回った場合) <path d="M 2,0 A 2,2 0 1 1 0,2" transform="scale(1,-1) translate(-1,2)" style="stroke:black;stroke-width:0.2;fill:none;" /> translate(-1,2)により座標系を左に1,下に2移動してから,上下の符号を逆にする.その新座標で(2,0)〜(0,2)が始点と終点になる.この2点を含む半径rx=2,ry=2の円周上の優弧(1)を正の向き(1)--scale(1,-1)の結果,反時計回り--に回る. |