Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++_C_Opengl_Graphics_Bezier - Fatal编程技术网

C++ 三次贝塞尔曲线相互作用

C++ 三次贝塞尔曲线相互作用,c++,c,opengl,graphics,bezier,C++,C,Opengl,Graphics,Bezier,所以我现在在XZ平面上有一个立方贝塞尔面片(y=0,所以它是一个平面面片)。该面片由16个控制点和400个总网格点组成。我目前试图实现的是选择中间4个控制点中的1个(任意一个),并在任意坐标方向上递增 我认为我遇到问题的部分实际上是用OpenGL绘图函数显示更改。下面是创建面片和当前绘图函数的代码,以及我当前使用的增量函数的示例 栅格是所有栅格点的二维阵列。 控件是由16个控制点组成的二维数组。 控制点由用户选择的菜单功能(选项1-4)更改,并初始化为1 编辑:修复了switch语句中的最后两个

所以我现在在XZ平面上有一个立方贝塞尔面片(y=0,所以它是一个平面面片)。该面片由16个控制点和400个总网格点组成。我目前试图实现的是选择中间4个控制点中的1个(任意一个),并在任意坐标方向上递增

我认为我遇到问题的部分实际上是用OpenGL绘图函数显示更改。下面是创建面片和当前绘图函数的代码,以及我当前使用的增量函数的示例

栅格是所有栅格点的二维阵列。 控件是由16个控制点组成的二维数组。 控制点由用户选择的菜单功能(选项1-4)更改,并初始化为1

编辑:修复了switch语句中的最后两个控制点

void bezier_plane()
{
    CalcBezier();
    for (int i = 0; i < 19; i++) {
        for (int j = 0; j < 19; j++) {
            glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
            glBegin(GL_TRIANGLE_STRIP);
                glVertex3f(grid[i][j].x, grid[i][j].y, grid[i][j].z);
                glVertex3f(grid[i][j+1].x, grid[i][j+1].y, grid[i][j+1].z);
                glVertex3f(grid[i+1][j].x, grid[i+1][j].y, grid[i+1][j].z);
                glVertex3f(grid[i+1][j+1].x, grid[i+1][j+1].y, grid[i+1][j+1].z);
            glEnd();
        }
    }
}

void CalcBezier()
{
    float u;
    float v;
    u = 0;
    for (int i = 0; i < 20; i++) {
        v = 0;
        for (int j = 0; j < 20; j++) {
            for (int x = 0; x < 4; x++) {
                for (int y = 0; y < 4; y++) {
                    grid[i][j].x += control[x][y].x * Bezier3(x, u) * Bezier3(y, v);
                    grid[i][j].y += control[x][y].y * Bezier3(x, u) * Bezier3(y, v);
                    grid[i][j].z += control[x][y].z * Bezier3(x, u) * Bezier3(y, v);
                }
            }
            v+=.05;
        }
        u+=.05;
    }
}

/*Is called when a menu button is hit, indicating that the control point is incremented in the y direction*/
void OnYInc()
{
    switch(control_point) {
    case 1:
        control[1][1].y += 2;
        break;
    case 2:
        control[1][2].y += 2;
        break;
    case 3:
        control[2][3].y += 2;
        break;
    case 4:
        control[2][4].y += 2;
        break;
    }
    InvalidateRect(NULL, FALSE);
}
void bezier_平面()
{
CalcBezier();
对于(int i=0;i<19;i++){
对于(int j=0;j<19;j++){
glPolygonMode(GLU前、后、GLU线);
glBegin(GLU三角带);
glVertex3f(grid[i][j].x,grid[i][j].y,grid[i][j].z);
glVertex3f(网格[i][j+1].x,网格[i][j+1].y,网格[i][j+1].z);
glVertex3f(grid[i+1][j].x,grid[i+1][j].y,grid[i+1][j].z);
glVertex3f(网格[i+1][j+1].x,网格[i+1][j+1].y,网格[i+1][j+1].z);
格伦德();
}
}
}
void CalcBezier()
{
浮动u;
浮动v;
u=0;
对于(int i=0;i<20;i++){
v=0;
对于(int j=0;j<20;j++){
对于(int x=0;x<4;x++){
对于(int y=0;y<4;y++){
网格[i][j].x+=控制[x][y].x*Bezier3(x,u)*Bezier3(y,v);
网格[i][j].y+=控制[x][y].y*Bezier3(x,u)*Bezier3(y,v);
网格[i][j].z+=控制[x][y].z*Bezier3(x,u)*Bezier3(y,v);
}
}
v+=0.05;
}
u+=0.05;
}
}
/*当点击菜单按钮时调用,指示控制点在y方向上递增*/
void onync()
{
开关(控制点){
案例1:
控件[1][1],y+=2;
打破
案例2:
控件[1][2],y+=2;
打破
案例3:
对照组[2][3],y+=2;
打破
案例4:
对照组[2][4],y+=2;
打破
}
无效(NULL,FALSE);
}
我的onDraw函数也只调用bezier_plane()。现在,使用上面的代码,当我尝试以y为单位递增时。网格中的三角形只会变得更大,但似乎根本无法正确绘制。这有点难以形容

结果是这样的。第一个屏幕截图是在我点击增量之前。第二个屏幕截图和第三个屏幕截图是单击1次后和单击10次后的样子。我也不太清楚为什么当我在y方向上递增时,面片的范围实际上在变化(随着我不断递增y,面片的范围似乎越来越大)


radical7已经为您解决了这个问题。因为在调用CalcBezier之前不会将grid设置为零,所以每次调用CalcBezier时,所有网格值都会递增。更改了OnYInc,使控制点不受影响,只是竖立起来,您将看到相同的行为

如果难以描述,请截图几张。在调用
CalcBezier()之前,您是否将
grid
的元素设置为零
每次?否。网格最初设置为0,然后不会更改,除非在Calcbezier中进行更改。添加my onDraw函数会提供有用的信息吗?我不想在我的帖子中添加不必要的代码。这会使人难以阅读。那个开关坏了。它应该类似于
control[(control_point-1)/2+1][control_point].y+=2Doh!真不敢相信我居然没想到。这似乎成功了。谢谢你和激进分子