SVGパス可視化 & カーブインスペクター
SVG pathのd属性を可視化し、コマンドごとに分析
<path> や <svg> 全体を貼り付けると d 属性だけを抽出します。
コマンド一覧
| # | コマンド | 概要 |
|---|
カーブインスペクター
再フォーマット
処理中…
0.0
停止していません。計算が終わると結果が表示されます。
SVGパス可視化 & カーブインスペクターについて
SVGパスのd属性を貼り付けると、コマンドごとの区間に分けて描画し、ベジェ曲線の制御点や円弧の中心も表示します。<svg>のコード全体を貼っても最初のpathのdを取り出します。コマンドの種類別の数、サブパス数と閉じているか、バウンディングボックス、パスの長さを計算し、引数が足りないコマンドなどのエラーを位置付きで知らせます。
整形機能では座標をすべて絶対(大文字)またはすべて相対(小文字)に変換し、小数桁(初期値3桁)を減らし、読みやすく整えるか最大限詰めて出力します。長さは区間ごとに72点で測る近似値なので、ブラウザのgetTotalLength()と小数点以下で少し違うことがあります。
6つのコマンドでほとんど読める
パスは「ペンをどこに置き、どう動かすか」のリストです。アイコンのファイルでよく見るのは次のコマンドです。残りのH・Vは水平・垂直の直線、S・Tは直前の曲線の制御点を対称に引き継ぐ省略形です。
- M x y — ペンを持ち上げて移動します。新しいサブパスが始まります。Mの後に座標が続くとLとして扱われます。
- L x y — 現在の点から直線を引きます。
- C x1 y1 x2 y2 x y — 3次ベジェ。2つの制御点が曲線の出発と到着の向きを決めます。
- Q x1 y1 x y — 2次ベジェ。制御点が1つで形が単純です。TrueTypeフォントの輪郭はこれで作られています。
- A rx ry 回転 大円弧フラグ 方向フラグ x y — 楕円の一部として円弧を描きます。
- Z — 現在のサブパスの始点へ直線を引いて閉じます。塗りだけならZがなくても塗られますが、線(stroke)の角のつなぎ方が変わります。
円弧(A)の2つのフラグが分かりにくい理由
Aコマンドが与えるのは始点・終点・半径だけです。2点を通る半径rの円は普通2つあり、それぞれの円で2点を結ぶ弧には短い側と長い側があります。つまり候補は4本で、2つのフラグがそのうち1本を選びます。large-arcが1なら180°より大きい弧、0なら小さい弧です。sweepが1なら角度が増える向きで、SVGはy軸が下向きなので画面上では時計回りになります。
半径が2点間の距離の半分より小さいと、条件を満たす円がありません。仕様ではちょうど届くまで半径を拡大すると定められていて、このツールもそのように計算します。半径10と書いたのに大きな半円になるのはこの補正のためです。半径がちょうど半分なら候補は半円1つなので、large-arcの値は結果に影響しません。
フラグは0か1の1文字なので区切りなしで続けて書けます。圧縮されたファイルの「a60 60 0 01100 0」は、フラグ0と1の後にx=100、y=0です。このツールはこの表記も読めます。
絶対座標と相対座標
大文字のコマンドはキャンバス原点からの座標、小文字は現在のペン位置からの移動量です。アイコンを別の場所に動かすとき、絶対座標のパスはすべての数値を直す必要がありますが、相対座標なら最初のmを変えるだけです。最適化ツールの出力が小文字中心なのも、小さな移動量は桁が少なくファイルが小さくなるからです。
よくある間違いは、相対cの制御点を「直前の制御点」基準だと思うことです。3組とも区間の始点が基準です。(10,10)から始まるC 20 20, 40 20, 50 10は、相対ではc 10 10 30 10 40 0になります。
zの直後の小文字mは、zが戻ったサブパスの始点を基準に計算されます。手でパスを結合して図形が変な位置に出たら、ここを確認してください。
パスがおかしく表示されるとき
数値の区切りは空白やカンマだけでなく、符号や小数点でもかまいません。「10-5」は10と-5、「.5.5」は0.5と0.5です。読みにくいものの規則上は正しい表記です。逆にLの後に数値が1つしかなければエラーで、ブラウザは普通その地点でパスの描画を止めます。
ドーナツや文字のOのような穴あき図形が塗りつぶされて見えるなら、fill-ruleを疑ってください。初期値のnonzeroでは、内側のサブパスを外側と逆向きに描かないと穴になりません。evenoddにすれば向きに関係なく穴が開きます。
例
フラグ4通りの比較
- 入力
M50 100 A 60 60 0 [大円弧] [方向] 150 100- 結果
0 0:長さ118.2、下へ26.8/0 1:118.2、上へ26.8/1 0:258.7、下へ93.2/1 1:258.7、上へ93.2
2点の距離100、半径60なら円の中心は弦から√(60²−50²)≈33.2離れます。小さい弧の高さは60−33.2、大きい弧は60+33.2です。
半径が小さすぎる場合
- 入力
M50 100 A 10 10 0 0 1 150 100- 結果
半径50に補正されて半円、長さ157.1、バウンディングボックス100×50
弦の半分50未満の半径は仕様に従い50まで拡大されます。半円の長さはπ×50≈157.1です。
相対座標への変換
- 入力
M10 10 H 110 V 60 L 10 60 Z- 結果
m 10 10 h 100 v 50 l -100 0 z
各コマンドの終点から直前の点を引いた値になります。
使い方
- d文字列かSVGコードを貼り付けるか、サンプルを選びます。
- 区間をクリックして制御点、円弧の中心、始点・終点を確認します。
- 座標方式と小数桁を決め、整形したパスをコピーします。
よくある質問
大文字と小文字のコマンドの違いは何ですか。
大文字は絶対座標、小文字は現在の点からの相対座標です。同じ形をどちらでも書け、このツールで一括変換できます。
Aコマンドのlarge-arcとsweepとは?
同じ2点と半径で描ける4本の弧から1本を選ぶ値です。large-arcは180°を超えるか、sweepは画面上で時計回り(1)かどうかです。
半径を変えても形が変わりません。
半径が2点間距離の半分より小さいと、自動的に半分まで拡大されるためです。
長さがブラウザの値と少し違います。
区間ごとに72点で近似しているためです。大きく急な曲線ほど差が出ます。
出典
基準日: