通過計算擬合線段的長度實現(xiàn)貝塞爾曲線模擬軌跡的計算;通過逐步繪制擬合線段還原用戶繪制軌跡
[0053]參照圖1,示出了本申請的一種繪制軌跡的還原方法實施例的步驟流程圖,具體可以包括如下步驟:
[0054]步驟101,接收用戶輸入的繪制點;
[0055]在圖像或視頻后期處理軟件中,由于硬件設(shè)備和軟件的效率限制,在拖拽時,每隔一段時間才響應(yīng)一個點。因而用戶連續(xù)繪制的軌跡,變成了離散的繪制點。
[0056]步驟102,采用貝塞爾曲線對所述繪制點進行模擬,生成貝塞爾曲線模擬軌跡;
[0057]貝塞爾曲線由線段和控制點組成,通過調(diào)整控制點可以調(diào)整線段的形狀,控制點按從落筆到起筆的順序排序,組成控制點序列。
[0058]步驟103,獲取所述貝塞爾曲線模擬軌跡的控制點序列;
[0059]步驟104,采用所述控制點序列對所述貝塞爾曲線模擬軌跡進行曲線擬合,生成擬合所述貝塞爾曲線模擬軌跡的擬合線段;
[0060]具體可以采用直線段逼近曲線的方法,通過細(xì)分的直線段逐段代替貝塞爾曲線。
[0061]步驟105,按預(yù)設(shè)長度間隔逐步繪制所述擬合線段。
[0062]可以通過計算各段擬合線段的總長度,然后選取一個合適的步長間隔逐步繪制擬合線段。在圖像或視頻后期處理軟件的界面中,即可逐步顯示繪制曲線。
[0063]在本申請實施例中,利用貝塞爾曲線對繪制軌跡進行修補,來模擬用戶的繪制軌跡。具體來說,本申請實施例中是基于德卡斯特里奧算法計算貝塞爾曲線上的點,進而計算出貝塞爾曲線上的坐標(biāo),從而繪制貝塞爾曲線。
[0064]參照圖2所示是本申請的一種基于德卡斯特里奧算法的向量示意圖,圖2中的A、B兩點構(gòu)成了向量AB,德卡斯特里奧算法的基礎(chǔ)就是在向量AB上選擇一個點C,使得C將向量AB的比例分為u:l-u(也就是I AC 1:1 AB I =u)。給定點A、B的坐標(biāo)以及分割系數(shù) u(u e [0,1])的值,點 C 的坐標(biāo)便為:C = A+(B-A)*u = (l_u)*A+B*u。
[0065]在本申請的一種示例中,定義貝塞爾曲線的控制點Pi編號為0i,其中,0表示是第0次迭代。當(dāng)?shù)谝?、二、三……次迭代時,0將會相應(yīng)被1、2、3……依次替換。
[0066]德卡斯特里奧算法的思想如下:為了計算η次貝塞爾曲線上的點C(u),u e [0,
1],首先將控制點連接形成一條折線00-01-02......0 (n-1)-On。利用上述方法,計算出折線中每條線段Oj-0(j+l)上的一個點lj,使得點lj分該線段的比為u:l-u。然后在折線10-11-……-l(n-l)上遞歸調(diào)用該算法,以此類推。最終,求得最后一個點nO。德卡斯特里奧證明了,點nO —定是曲線上的點。
[0067]在本申請實施例中,所述德卡斯特里奧運算包括N次遞推運算,每進行一次遞推運算,就得到一組分割點序列,分割點序列含有的分割點的數(shù)目為所述控制點序列的控制點個數(shù)減去當(dāng)前進行的遞推運算的次序數(shù)。
[0068]參照圖3所示是本申請的一種基于德卡斯特里奧算法的向量示意圖如圖,曲線控制點是00、01、02、03、04、05。線段00-01上取點10,10分該線段的比為u: l_u,類似地取點11、12、13、14,然后第二次迭代在線段10-11上取點20,點20分該線段的比為u: l_u,類似地取點21、22、23。然后進行下一次迭代,依次類推,直到最后在線段40-41上取點50,50是最終惟一的點,也是在曲線上的點。
[0069]參照圖4所示是本申請的德卡斯特里奧運算遞推的示意圖。
[0070]上述直觀的算法描述可以表達成一個計算方法。
[0071]首先,將所有給定的控制點排列成一列,在上圖中,即為最左邊的一列。每一對相鄰的控制點可以伸出兩個箭頭,分別指向右下方和右上方。在相鄰箭頭的交叉處,生成一個新的控制點。例如,控制點ij和i (j+1)生成新的控制點(i+l)j。指向右下方的箭頭表示乘以(1-u),指向右上方的箭頭表示乘以u。
[0072]因此,通過第0列,可以求出第1列,然后求出第2列……,最終,在η次迭代后,可以到達惟一的一個點η0,這個點就是曲線上的點。
[0073]該計算過程算法如下:
[0074]Input:array P[0:n]of n+lpoints and real number u in[0,1]Output:point oncurve, C(u)Working:point array Q[0:n]for 1: = Oto n do
[0075]Q[i]: = P[i] ;//save input
[0076]for k: = 1 to n do
[0077]for 1: = 0 to n_k do
[0078]Q[i]: = (l-u)Q[i]+u Q[i+1];
[0079]return Q[0];
[0080]該計算方法直接通過遞歸方法計算Pi,j效率低下,其原因是:遞歸方法有大量的重復(fù)計算。實際應(yīng)用中,常用3階的貝塞爾曲線,是要對4個點進行計算。設(shè)已知的4點為p0 (x0,y0),pi (xl,yl),p2 (x2,y2),p3 (x3,y3),其中 0 和 3 是端點,1,2 是控制點,則該曲線上的所有點表示為:
[0081]X = (l_t)~3*x0+3*t*(l_t)~2*xl+3*t~2*(l_t)*x2+t~3*x3
[0082]y = (l_t)~3*y0+3*t*(l_t)~2*yl+3*t~2*(l_t)*y2+t~3*y3
[0083]其中0〈 = t〈 = l。
[0084]按照公式,對每個t,代入式子就可以得到曲線上對應(yīng)點的坐標(biāo)了。當(dāng)然具體實現(xiàn)時,可根據(jù)適當(dāng)?shù)拈g隔取t值,然后用直線將這些值對應(yīng)的點連起來就是了。
[0085]類似于多項式的計算,在計算機上計算的時候,可以用德卡斯特里奧算法來求出,而不必直接計算高次冪。
[0086]作為本申請實施例的一種優(yōu)選示例,所述步驟104可以包括如下子步驟:
[0087]子步驟SI 1,將控制點序列中的第一個控制點與最后一個控制點作為節(jié)點,將除第一個控制點和最后一個控制點之外的控制點作為由所述第一個控制點與最后一個控制點所確定的節(jié)點對應(yīng)的中間點;
[0088]子步驟S12,比較各個中間點到節(jié)點線段的距離中最大的距離值與預(yù)設(shè)的閾值的大小,所述節(jié)點線段為由兩個節(jié)點連接成的線段;
[0089]子步驟S13,若最大的距離值小于預(yù)設(shè)的閾值,則將所述節(jié)點線段作為擬合線段;
[0090]子步驟S14,若最大的距離值大于預(yù)設(shè)的閾值,則采用所述控制點序列和預(yù)設(shè)的分割系數(shù)進行德卡斯特里奧運算,得到N-1組分割點序列,N的數(shù)值為所述控制點序列的控制點個數(shù)減1 ;
[0091]子步驟S15,采用所述控制點序列和分割點序列確定新的節(jié)點和中間點;
[0092]子步驟S16,返回所述比較各個中間點到節(jié)點線段的距離中最大的距離值與預(yù)設(shè)的閾值的大小的步驟。
[0093]在本申請實施例中,其特征在于,所述控制點序列中控制點的數(shù)目為貝塞爾曲線的階數(shù)加1 ;所述控制點序列中的第一個控制點為用于模擬貝塞爾曲線模擬軌跡的第一個繪制點,所述控制點序列中的最后一個控制點為用于模擬貝塞爾曲線模擬軌跡的最后一個繪制點。
[0094]參照圖5所示是本申請的一種基于德卡斯特里奧算法的計算貝塞爾曲線的示意圖。其中,控制點序列包括點p00、plO、p20、p30四個控制點,p00第一個控制點,p30為最后一個控制點;采用分割系數(shù)為0.5對控制點序列按照德卡斯特里奧算法進行運算,可以得到3組分割點序列;第一組分割點序列包括點pll、p21、p31 ;第二組分割點序列包括點p22、p32 ;第三組分割點序列包括點p33。由德卡斯特里奧算法可知點33即貝塞爾曲線上的點。
[0095]因為貝塞爾曲線總是處在控制點的凸包內(nèi),那么可以得知貝塞爾曲線上的點到線段P00P30(第一個控制點和最后一個控制點連接的線段)的距離不大于plO到p00p30的距離或p20到p00p30的距離中的較大值)。