編集:これを使用しないでください!さらにテストしたところ、A->C 変換はすべての場合に信頼できるわけではなく、他のパス コマンドの組み合わせも失敗することがわかりました。代わりにこれを使用してください!
最終的に、Safari、Opera、IE9、Firefox、および Chrome で動作するようになりました:
http://jsfiddle.net/timo2012/M6Bhh/41/
この関数は SVG パスのデータを正規化し、すべてのパス セグメントが M、C、L、および z (= 絶対座標、つまりすべての相対座標が絶対座標に変換されることを意味します) に変換されるようにします。他のすべてのセグメントは自明で 100% 正確ですが、円弧 (A) は特殊なケースであり、円弧を線 (L)、2 次曲線 (Q)、または 3 次曲線 (C) に変換するかどうかを選択できます。最も正確なのは線ですが、解像度の独立性が失われます。何らかの理由で二次方程式は特定の円弧で失敗しますが、三次方程式はより正確です。
次のパスがあるとします。
<svg width="400" height="400">
<path stroke="red" stroke-width="3" d="M30 30 S40 23 23 42 L23,42 C113.333,113.333 136.667,113.333 150,80 t40,50 T230,240 q20 20 54 20 s40 23 23 42 t20,30 a20,30 0,0,1 -50,-50"/>
</svg>
次を使用して正規化します。
var path = document.querySelector('path');
path.normalizePath(3, 0.1); // 3 = C = cubic curves. Best alternative, rather good accuracy and path data remains reasonable sized
正規化されたバージョンは次のとおりです。
<svg width="400" height="400">
<path stroke="red" stroke-width="3" d="M 30 30 C 30 30 40 23 23 42 L 23 42 C 113.333 113.333 136.667 113.333 150 80 C 150 80 163.333 96.6667 190 130 C 216.667 163.333 230 200 230 240 C 243.333 253.333 261.333 260 284 260 C 284 260 324 283 307 302 C 307 302 313.667 312 327 332 C 324.811 336.924 321.997 341.154 318.719 344.448 C 315.441 347.741 311.762 350.033 307.893 351.194 C 304.024 352.355 300.04 352.361 296.169 351.213 C 292.298 350.064 288.616 347.783 285.333 344.5 C 282.05 341.217 279.23 336.996 277.035 332.078 C 274.839 327.161 273.311 321.642 272.537 315.839 C 271.763 310.035 271.759 304.06 272.525 298.254 C 273.291 292.448 274.811 286.924 277 282"/>
</svg>
両方を重ねて配置すると、結果は次のようになります (赤が正規化され、黒がオリジナルです)。

その他の可能性は次のとおりです。
path.normalizePath(1,0.5); // A->L, Many lines, high accuracy. Very good accuracy, but not so resolution independent, because when scaled, the corners become visible
path.normalizePath(1,40); // A->L, Few lines, less accuracy
path.normalizePath(2,0.5); // A->Q, quadratic curves. I tested this, but not good. Fails in some cases.
そして、これにはどのような利点がありますか?
パス データを正規化するためのネイティブな方法は、まだすべてのブラウザに実装されていないため、これまでのところ独自に行っています。また、ネイティブな方法が実装されている場合、すべてのブラウザーが同じように機能するかどうかはわかりません。SVG のドキュメントでは円弧を線に変換することについて述べていますが、SVG の主な利点である解像度の独立性が失われるため、これは良い方法ではありません。アークの正規化がどのように行われるかを完全に制御する必要があり、このスクリプトはその方法を提供します。
データが正規化されると、ビットマップ イメージの座標とまったく同じ方法でデータを変更できます。Illustrator の方法でパスをワープ (アーク、アーチ、バルジ、シェル、フラグ、ウェーブ、フィッシュ、ライズ、フィッシュアイ、インフレート、スクイーズ、ツイスト) したい場合、または遠近感を実現するためにパスを歪めたい場合は、正規化されたパス データを変更できます。確実に。
このコードは、YannickBochatay のスクリプトに基づいており、よりクロス ブラウザーにしました。