2017-03-26 39 views
0

作爲一項任務,我必須實現De Casteljau算法以繪製貝塞爾曲線。我完全理解這個算法是如何工作的,以及它是如何產生曲線的,但我無法理解我已經使用的算法的編碼實現。如何在這個實現中引用控制點來繪製曲線?

的分配新建分配FY由3個部分組成:

  1. 繪製的控制點一些數量的以及連接它們的邊緣。

  2. 對於給定參數t執行De Casteljau算法,該範圍將根據此參數繪製所有De Casteljau線和Bezier點。這是在一個函數來完成所謂的drawDeCasteljau

  3. 通過遍歷從t = 0.0t = 1.0並通過各tdrawDeCasteljau和繪畫每個貝塞爾點繪製曲線。這是在一個叫drawBezierCurve

然後該方案將通過以下方式運行函數來完成:

  • 點擊添加一個點和最後一個點這個新點的邊緣
  • 點擊並按住一個點將其左右拖動
  • +-增加或減少t。 (這是我目前)
  • 1顯示爲t
  • 當前值按2德應用Casteljau線和貝塞爾點繪製整條曲線

我們一直樣本算法給定的使用是:

int numPoints = 3; 
Point bezPoints[numPoints][numPoints]; 

void DrawBezier() { 
    for (float u = 0.0; u <= 1.0; u += 0.01) { 
     for (int diag = numPoints - 2; diasg >= 0; diag--) { 
      for (int i = 0; i <= diag; i++) { 
       int j = diag - i; 
       bezPoints[i][j] = (1.0 - u)*bezPoints[i][j + 1] + u*bezPoints[i + 1][j]; 
      } 
     } 
     setPixel(bezPoints[0][0]); 
    } 
} 

我完全與bezPoints矩陣和缺乏參照在算法的任何控制點/線丟失。

應該bezPoints已經填滿DrawBezier()之前執行的點數嗎?

如果我有3個控制點,爲什麼bezPoints是3x3矩陣?它存儲的這9點究竟是什麼?

該算法如何在沒有引用控制點/線的情況下工作?

編輯

得益於以下尼科的幫助下,我已成功地繪製貝塞爾曲線:

enter image description here

不過,我仍然在努力理解如何在完成上述步驟2爲了繪製用於查找當前值爲t的貝塞爾點的De Casteljau線。

回答

0

控制點應該在矩陣bezPoints的最遠對角線上。你只需要習慣索引。下面是它如何工作的:如果你有numPoints = 3,控制點應該在對角線2,即bezPoints[0][2], bezPoints[1][1], bezPoints[2][0]

i \ j | 0 | 1 | 2 
------+---+---+--- 
    0 |   C 
    1 |  C 
    2 | C 

diag循環應用的算法的一個迭代後填充其他對角線,即中間點:

i \ j | 0 | 1 | 2 
------+---+---+--- 
    0 |D=0 D=1 C 
    1 |D=1 C 
    2 | C 

然後,最後一點是在bezPoints[0][0]

變量u代表曲線參數。

+0

所以我應該手動填充這個對角線與控制點之前的算法執行?也許在聲明'bezPoints'和'DrawBezier'的行之間有一個循環遍歷這個對角線和控制點,引用對角線每個元素中的每個點? – KOB

+0

好的,所以你的解釋讓我弄清楚如何得到每個貝塞爾點,從而如何繪製整個曲線。我沒有完成上面列出的第1部分和第2部分,但我很難理解如何繪製各個線以找到Bezier點。換句話說,如何在這個圖像中繪製紅色和黃色的線條:http://www.e-cartouche.ch/content_reg/cartouche/graphics/en/image/casteljau/casteljau5.​​jpg – KOB

+0

黑色線條是控制多邊形並由最外對角線上的點形成。紅線由下一個對角線上的點組成('D = 1'),依此類推。請注意,圖片顯示的是3度曲線,而您的代碼會生成2度曲線(您有三個控制點)。 –