我试图创建一个立方体贝塞尔补丁,并有一点麻烦,找出我在哪里搞乱了计算。我在一个二维数组中有16个控制点,我希望网格中有400个点,每个点以0.05的增量分开。
控制点以20为增量(因此P0,0为(0,0,0),P3,3为(60,0,60)。网格将位于xz平面上,y坐标全部为0。
现在我有了下面的代码,它为每个点上的x和z提供了相同的值:
float Bezier3(int j, float k)
{
switch(j) {
case 0:
return (1 - k) * (1 - k) * (1 - k);
break;
case 1:
return 3*k*((1 - k) * (1 - k));
break;
case 2:
return 3 * (k * k) * (1 - k);
break;
case 3:
return k * k * k;
break;
}
}
void CalcBezier()
{
float u;
float v;
for (int i = 0; i < 20; i++) {
u = 0;
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);
}
}
u+=.05;
v+=.05;
}
}
}
我不太清楚我错在哪里。我试着沿着网格的柱状方向走,计算每个bezier点。
我还试图将生成的网格绘制为三角形网格:
void bezier_plane()
{
CalcBezier();
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
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();
}
}
}
最佳答案
看起来你在增加内环中的u和v。
尝试改变
u+=.05;
v+=.05;
}
到
v+=.05;
}
u+=.05;
并将重置移到循环外的零。
for (int i = 0; i < 20; i++) {
u = 0;
v = 0;
到
u = 0;
for (int i = 0; i < 20; i++) {
v = 0;
关于c++ - 三次贝塞尔曲线实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16176898/