Postscript/SVGパスから元のグラフィックプリミティブを再構築しようとしています。したがって、元の円は(SVGマークアップで)次のようにレンダリングされます。
<path stroke-width="0.5" d="M159.679 141.309
C159.679 141.793 159.286 142.186 158.801 142.186
C158.318 142.186 157.925 141.793 157.925 141.309
C157.925 140.825 158.318 140.432 158.801 140.432
C159.286 140.432 159.679 140.825 159.679 141.309" />
これは、4つのベジェ曲線を使用して円を作成する近似です。他の場所では、円弧はリンクされたベジェ曲線で近似されます。
私の質問は、この構成を認識して「最良の」円を再構成するために使用できるアルゴリズムがあるかどうかです。私は小さなエラーを気にしません-それらは最悪の場合二次になります。
更新:これが円または円弧であるかどうかをアプリオリに知らないことに注意してください-それは何でもかまいません。また、曲線上に2、3、4、またはそれ以上のポイントが存在する可能性があります。だから私は本当にこの種の関数が欲しいです:
error = getCircleFromPath(path)
ここで、error
これが円である可能性が高いかどうかを早期に示します。
[私はそれが円であることがわかっている場合、それはより簡単な問題であることに同意します。]
更新:@georgeは私の問題に答えるのにいくらか役立ちますが、それがすべてではないと思います。
原点に変換して正規化した後、曲線上に次の4つのポイントがあるように見えます。
point [0, 1] with control point at [+-d,1] // horizontal tangent
point [1, 0] with control point at [1,+-d] // vertical tangent
point [0, -1] with control point at [+-d,-1] // horizontal tangent
point [-1, 0] with control point at [-1,+-d] // vertical tangent
これにより、各ポイントの接線がそのポイントのパス方向に「平行」になることが保証されます。また、対称性も保証されます(反射を伴う4倍軸。ただし、円は保証されません。たとえば、の値が大きいd
とボックスが丸くなり、値が小さいとひし形が丸くなります。
私の値はd
約0.57のようです。これは1/sqrt(3。)かもしれませんし、他の何かかもしれません。それは私が求めているこの種の関係です。
@georgeは、円弧の中点を次のように指定します。
{p1,(p1 + 3 (p2 + p3) + p4)/8,p4}
したがって、私の例(1,0から0.1の場合)では、これは次のようになります
[[1,0]+3[1,d]+3[d,1]+[0,1]] / 8
。
[0.5+3d/8, 3d/8+0.5]
d = 0.57の場合、これは0.71になるので、おそらくdは
(sqrt(0.5)-0.5)*8./3.
これは正方形のダイアモンドにも当てはまりますが、円弧の場合、式はより一般的である必要があり、誰かがそれを持っていればありがたいです。たとえば、私はベジェ数学に精通していないので、@georgeの式は私にとって新しいものでした
enter code here