C++ 在此实现中,绘制曲线时如何引用控制点?
作为一项任务,我必须实现De Casteljau算法来绘制贝塞尔曲线。我完全理解这个算法是如何工作的,以及它是如何产生曲线的,但是我没有理解给我使用的算法的编码实现 该分配由3部分组成:C++ 在此实现中,绘制曲线时如何引用控制点?,c++,curve,C++,Curve,作为一项任务,我必须实现De Casteljau算法来绘制贝塞尔曲线。我完全理解这个算法是如何工作的,以及它是如何产生曲线的,但是我没有理解给我使用的算法的编码实现 该分配由3部分组成: 绘制一些控制点以及连接它们的边 对[0,1]范围内的给定参数t实施德卡斯特尔JAU算法,该参数将根据该参数绘制所有德卡斯特尔JAU线和贝塞尔点。这是在一个名为drawDeCasteljau 通过迭代从t=0.0到t=1.0绘制曲线,并将每个t传递到drawDeCasteljau并绘制每个贝塞尔点。这是在一个名为
t
实施德卡斯特尔JAU算法,该参数将根据该参数绘制所有德卡斯特尔JAU线和贝塞尔点。这是在一个名为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]);
}
}
int numPoints=3;
点[numPoints][numPoints];
void-DrawBezier(){
对于(浮点u=0.0;u=0;诊断--){
对于(int i=0;i而言,控制点应位于矩阵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
然后,最后一个点位于点[0][0]
变量u
表示曲线参数。那么,在执行相关算法之前,我是否应该用控制点手动填充该对角线?也许在声明bezPoints
和DrawBezier
的行之间有一个循环,循环通过该对角线和控制点s、 引用对角线每个元素中的每个点?好的,你的解释让我明白了如何得到每个贝塞尔点,从而画出整个曲线。我没有上面列出的完整的第1部分和第2部分,但我很难理解如何绘制每条线来找到贝塞尔点。换句话说,如何在此图像中绘制红色和耶洛线:黑线是控制多边形,由最外层对角线上的点构成。红线由下一条对角线上的点(D=1
)等构成。请注意,图中显示的是3度曲线,而代码生成的是2度曲线(你有三个控制点)。是的,我同时也弄明白了。我误解背后的麻烦是弄明白了不同的点在矩阵中的位置(矩阵的结构)。一旦弄明白了,我只需用draudge(bezPoints[I][j+1]替换行bezPoints[I][j]=…
,bezPoints[i+1][j]
在原始算法中。