作为一项任务,我必须实施De Casteljau算法以绘制Bezier曲线。我完全理解这个算法是如何工作的,以及它如何产生曲线,但我无法理解我已经给出的算法的编码实现。
该分配由3部分组成:
绘制一些控制点以及连接它们的边缘。
针对[0,1]范围内的给定参数t
实施De Casteljau算法,该算法将根据此参数绘制所有De Casteljau线和Bezier点。这是在名为drawDeCasteljau
通过从t = 0.0
迭代到t = 1.0
并将每个t
传递到drawDeCasteljau
并绘制每个贝塞尔点来绘制曲线。这是在名为drawBezierCurve
该程序将以下列方式工作:
+
或-
可增加或减少t
。 (这是我现在的位置)1
显示当前值t
2
绘制整条曲线我们使用的样本算法是:
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个点究竟是什么?
算法在没有引用控制点/线的情况下如何工作?
修改
感谢下面Nico的帮助,我设法绘制了Bezier曲线:
但是,我仍然在努力了解如何完成上面的第2步,以便绘制用于查找当前值t
的贝塞尔点的每个De Casteljau线。
答案 0 :(得分: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
表示曲线参数。