2014-12-20 75 views
2

我是SVG的初學者。通過預定點的SVG曲線

我需要一個SVG曲線來通過點列表。它是用C++計算的數學函數,輸出結果應該寫入SVG文件。我的問題是SVG中的path標記沒有通過所有點。相反,它在中間跳過其中的一部分,並傾向於它們。 SVG是否有任何工具可以將曲線通過整個點並以自動方式適當彎曲曲線?

Mathematical Curve

<svg height="400" width="450"> 
    <path d="M 80 90 C 190 40, 300 60, 380 160" stroke="blue" stroke-width="5" fill="none" /> 
    <path d="M 80 90 L 190 40, 300 60, 380 160" stroke="green" stroke-width="1" fill="none"/> 
    <g stroke="black" stroke-width="3" fill="black"> 
    <circle id="pointC" cx="80" cy="90" r="3" stroke="black"/> 
    <circle id="pointA" cx="190" cy="40" r="3" stroke="green"/> 
    <circle id="pointC" cx="300" cy="60" r="3" stroke="red"/> 
    <circle id="pointB" cx="380" cy="160" r="3" stroke="blue"/> 
    </g> 
    Sorry, your browser does not support inline SVG. 
</svg> 

回答

0

如果您需要通過多點繪製平滑曲線,請考慮使用Catmull Rom樣條曲線或Overhauser樣條曲線。這兩種算法都會在分段交匯處產生具有C1連續性的三次樣條曲線。此外,它們比實施C2 B樣條插值更容易實現,因爲後者需要您解算線性方程組。您還可以輕鬆地將Catmull Rom樣條曲線或Overhauser樣條曲線轉換回Bezier曲面。

+0

請讓我知道,如果我正確理解catmull-rom。對於諸如P0和P1的端點,控制點是(2/3)P0 +(1/3)P1,對於其餘點,例如Pa,Pb,Pc的結果,Pb之前的控制點是Pb +(1/6)*(Pa-Pc),Pb後的控制點爲Pb +(1/6)*(Pc-Pa)。我對麼? – barej

+0

@OP:是的。那是對的。但是,列出的公式適用於統一的Catmull Rom樣條,它假定數據點的統一參數化(即t0 = 0.0,t1 = 1.0,t2 = 2.0,...等)。使用Centripetal Catmull Rom樣條(參考Wiki頁面)會更好,當數據點分佈不均勻時,可以產生更好的結果。 – fang

0

SVG路徑使用貝塞爾曲線

  • 即逼近不插所以一般不通過控制點

怎麼辦:

  1. 用插值三次曲線,並將其轉換爲Bezier

    • 看吧:Interpolation cubic to Bezier cubic(需要這種像你類似的原因)
    • 我使用一個特定的插值立方那裏與連接C1(位置和第一個派生)
    • 翻譯爲Bezier有這麼你可以用它
    • 只是轉換的控制點...
    • 不要忘記爲整個貝塞爾路徑的3倍多個唯一的第一個和最後一個控制點
    • 不是爲每個貝塞爾補丁!
  2. 使用許多行而不是單個貝塞爾

    • 這將是不連貫的粗的(取決於線密度)
    • 只是插足夠的點,並通過線連接它們
  3. 重複控制點

    • 如果你multipled控制研究分(3次),然後貝塞爾將通過這一點
    • 所以如果你有曲線點:p0,p1,p2,p3,...
    • 然後做多貝濟耶從他們這樣的:
    • p0,p0,p0,p1
    • p0,p0,p1,p2
    • p0,p1,p2,p3
    • p1,p2,p3,p3
    • p2,p3,p3,p3
    • p3,p3,p3,p4
    • p3,p3,p4,p5
    • p3,p4,p5,p6
    • p4,p5,p6,p6
    • p5,p6,p6,p6 ...
    • 這將通過點P0,P3,P6,...
    • 所以你仍然需要評估非通過控制點以確保所需的連接性