2009-08-10 40 views
4

我有近似的曲線折線,我希望把它畫成以PostScript平滑的曲線,它支持Bezier曲線的繪製。爲此,我需要在每對摺線點之間生成兩個控制點。 (我不能從源頭上得到原來的曲線,只是折線)如何創建貝塞爾曲線來表示平滑多段線?

我已經使用基數樣條從this description一些成功,但這裏的參數從WikipediaGDIPlus.DrawCurve,不同的是這兩個指張力。 MS沒有細節,維基百科有不完整的細節(基數樣條忽略x值?)。

什麼是基於張力控制點的公式?

回答

14

請參閱此鏈接http://www.ibiblio.org/e-notes/Splines/Cardinal.htm這提供了可用於計算貝塞爾控制點用於多段平滑曲線簡單的公式。

方程是非常簡單的,但對於那些不想重複,我提供我的結果計算誰:

讓PI(I = 1..N)是折線點。

首先,學習如何計算在Pi上的衍生物:

P1' = (P2 - P1)/a 
Pi' = (Pi+1 - Pi-1)/a (for i=2..n-1) 
Pn' = (Pn - Pn-1)/a 

其中 「a」 是一個coeffecient(這可能意味着你提到的 「張力」),例如a = 2的。

然後,對於每個段I(I = 1 ... N-1)從P i向P + 1,貝塞爾控制點B1I和B2I將是:

B1i = Pi + Pi'/3 
B2i = Pi+1 - Pi+1'/3 
+1

我希望有人知道明確,但通過檢查DrawPath結果,我認爲在答案中使用的術語中有2/a。 – xan 2009-10-15 11:21:15

+0

太棒了!我一直在尋找這麼短的工作解決方案:) – mmbrian 2014-12-23 15:18:41

0

你可以用兩個步驟做:首先做了三次B樣條曲線,然後從中得到三次Bezier曲線。

與擬合貝塞爾曲線訣竅是匹配的段的端點的衍生物,這在本質上是花鍵做什麼。如果可以看到樣條曲線的表示形式,則應該爲每個節段的終點和控制點設置點。否則,您可以確定每個線段終點的斜率,控制點將是外推線的交點。