我想從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條貝濟耶曲線來創建circle.In其他地方圓弧通過連接貝塞爾曲線近似的近似。
我的問題是,是否有一個算法,我可以用它來識別這個結構,並重建「最佳」的圈子。我不介意小小的錯誤 - 最差的時候他們會成爲第二順位。
更新:請注意,我不知道這是一個圓或弧 - 它可能是任何東西。曲線上可能有2,3,4甚至更多點。所以,我真的想排序的函數:
error = getCircleFromPath(path)
其中error
會給這是否可能是一個圓的早期跡象。
[我同意,如果我知道這是一個圓圈這是一個簡單的問題。]
UPDATE:@george大大有助於回答我的問題的一些辦法,但我不認爲這是故事的全部。
翻譯的起源和規範化我似乎有曲線上的以下四點以後:
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
將給出一個圓角框和一個小值圓形鑽石。 。約爲0.57,這可能是1 /開方或者它可能是else.It是這種關係我要求
@george給出了圓弧的中點爲(3);
{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.
這適用於正方形金剛石,但對於圓弧的公式必須是更一般的和I」如果有人有,請感激。例如,我不熟悉貝塞爾數學,所以@喬治的公式是新的我
enter code here
第一次計算僅顯示您有一個對稱對象 - 它可能是一個圓角框,而不是一個圓。 (+1)是有價值的 - 必要的,但仍然不夠,如果你能告訴我如何採樣除了解決問題的中點以外的點 –
謝謝 - 我只看到你的更新,這是我想要的 –