2015-05-02 131 views
0

我需要顯示貝塞爾曲線。用戶通過點擊顯示區域來選擇任意點。將高階貝塞爾曲線分解爲許多三次曲線

我實現了用這些點生成貝塞爾曲線的代碼,但是對於高階曲線,它不起作用,一旦順序等於控制點的數量-1。

如何分割這些控制點以創建一系列表示我想要的整個曲線的三次貝塞爾曲線?

+1

可能重複的[轉換二次貝塞爾於立方?](http://stackoverflow.com/questions/3162645/convert-a-quadratic-bezier-to-a-立方體) – Augwa

+1

你似乎有兩件事情正在進行。你說:「我實現了一個代碼來使這些點變成貝塞爾曲線,但對於更高的訂單它不起作用」。如果您向我們展示您的代碼並告訴我們輸出有什麼問題,也許我們可以幫助您解決問題。這可能是一個完全不同的問題,而不是使用三次Bézier分段逼近高階Bézier曲線。你真的想解決哪個問題? (請注意,一般情況下,您不能找到一組包含**的立方體片段,它們恰好與最初的高階曲線具有相同的點。) –

+1

@robmayoff我所做的代碼使用了所有的點,所以順序將會太高,無法工作。所以我想分成三次曲線。不需要完全相同的曲線,而是足夠好的近似值。 –

回答

3

我敢肯定,你可以在「繪製光滑的貝塞爾曲線」使用adaptive methods找到很好的資源,但這裏是我認爲這是一個好簡單的方法(如果未優化的相當):

  • 生成二項式係數。例如,第五次曲線可以表示爲:

    Expanded Bezier polynomial

    二項式係數是帕斯卡三角的第n行:

    1, 5, 10, 10, 5, 1 
    
  • 自適應的位置處執行遞歸其中連續分裂產生評估點的重大變化。這發生在尖角/尖銳的彎曲處,需要很多點才能收斂到可接受的解決方案。例如:的

    Note that ||B(a) - B(b)|| is notation for the length 
    of the line between the evaluated points B(a) and B(b). 
    
    Evaluate B(t) for values of t = a, b, c, d, e 
               = 0, 0.25, 0.5, 0.75, 1. 
    
    Evaluate lengths of straight line segments: 
        ac = ||B(a) - B(c)|| 
        ce = ||B(c) - B(e)|| 
    
        Also evaluate ab, bc, cd, de. 
    
    if ac - (ab + bc) > ERROR_THRESHOLD 
        Split ab into two segments and split bc into two segments. 
    else 
        We have found a good enough approximation. 
    
    Do the same as above for ce - (cd + de). 
    
+1

儘管如此,作爲關於可編程性的一個註釋:如果事物變得非常昂貴且甚至是可混合的,您實際上不能使用伯恩斯坦多項式繪製高階曲線;所涉及的值太大而不能很快適應浮點數據類型。對於低階曲線,使用線性插值的速度同樣快,但具有保持在由初始控制座標設置的範圍內的數字的好處,所以您甚至可以快速地計算第6,10或40階曲線座標準確地。 –