作爲一項任務,我必須實現De Casteljau算法以繪製貝塞爾曲線。我完全理解這個算法是如何工作的,以及它是如何產生曲線的,但我無法理解我已經使用的算法的編碼實現。如何在這個實現中引用控制點來繪製曲線?
的分配新建分配FY由3個部分組成:
繪製的控制點一些數量的以及連接它們的邊緣。
對於給定參數
t
執行De Casteljau算法,該範圍將根據此參數繪製所有De Casteljau線和Bezier點。這是在一個函數來完成所謂的drawDeCasteljau
通過遍歷從
t = 0.0
到t = 1.0
並通過各t
到drawDeCasteljau
和繪畫每個貝塞爾點繪製曲線。這是在一個叫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點究竟是什麼?
該算法如何在沒有引用控制點/線的情況下工作?
編輯
得益於以下尼科的幫助下,我已成功地繪製貝塞爾曲線:
不過,我仍然在努力理解如何在完成上述步驟2爲了繪製用於查找當前值爲t
的貝塞爾點的De Casteljau線。
所以我應該手動填充這個對角線與控制點之前的算法執行?也許在聲明'bezPoints'和'DrawBezier'的行之間有一個循環遍歷這個對角線和控制點,引用對角線每個元素中的每個點? – KOB
好的,所以你的解釋讓我弄清楚如何得到每個貝塞爾點,從而如何繪製整個曲線。我沒有完成上面列出的第1部分和第2部分,但我很難理解如何繪製各個線以找到Bezier點。換句話說,如何在這個圖像中繪製紅色和黃色的線條:http://www.e-cartouche.ch/content_reg/cartouche/graphics/en/image/casteljau/casteljau5.jpg – KOB
黑色線條是控制多邊形並由最外對角線上的點形成。紅線由下一個對角線上的點組成('D = 1'),依此類推。請注意,圖片顯示的是3度曲線,而您的代碼會生成2度曲線(您有三個控制點)。 –