如何在此实现中引用控制点来绘制曲线?

时间:2017-03-26 19:59:36

标签: c++ curve

作为一项任务,我必须实施De Casteljau算法以绘制Bezier曲线。我完全理解这个算法是如何工作的,以及它如何产生曲线,但我无法理解我已经给出的算法的编码实现。

该分配由3部分组成:

  1. 绘制一些控制点以及连接它们的边缘。

  2. 针对[0,1]范围内的给定参数t实施De Casteljau算法,该算法将根据此参数绘制所有De Casteljau线和Bezier点。这是在名为drawDeCasteljau

  3. 的函数中完成的
  4. 通过从t = 0.0迭代到t = 1.0并将每个t传递到drawDeCasteljau并绘制每个贝塞尔点来绘制曲线。这是在名为drawBezierCurve

  5. 的函数中完成的

    该程序将以下列方式工作:

    • 单击以添加从最后一个点到此新点的点和边缘
    • 点击并按住某个点以将其拖动
    • +-可增加或减少t。 (这是我现在的位置)
    • 1显示当前值t
    • 的De Casteljau线和Bezier点
    • 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曲线:

    enter image description here

    但是,我仍然在努力了解如何完成上面的第2步,以便绘制用于查找当前值t的贝塞尔点的每个De Casteljau线。

1 个答案:

答案 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表示曲线参数。