Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在此实现中,绘制曲线时如何引用控制点?_C++_Curve - Fatal编程技术网

C++ 在此实现中,绘制曲线时如何引用控制点?

C++ 在此实现中,绘制曲线时如何引用控制点?,c++,curve,C++,Curve,作为一项任务,我必须实现De Casteljau算法来绘制贝塞尔曲线。我完全理解这个算法是如何工作的,以及它是如何产生曲线的,但是我没有理解给我使用的算法的编码实现 该分配由3部分组成: 绘制一些控制点以及连接它们的边 对[0,1]范围内的给定参数t实施德卡斯特尔JAU算法,该参数将根据该参数绘制所有德卡斯特尔JAU线和贝塞尔点。这是在一个名为drawDeCasteljau 通过迭代从t=0.0到t=1.0绘制曲线,并将每个t传递到drawDeCasteljau并绘制每个贝塞尔点。这是在一个名为

作为一项任务,我必须实现De Casteljau算法来绘制贝塞尔曲线。我完全理解这个算法是如何工作的,以及它是如何产生曲线的,但是我没有理解给我使用的算法的编码实现

该分配由3部分组成:

  • 绘制一些控制点以及连接它们的边

  • 对[0,1]范围内的给定参数
    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]
    在原始算法中。