Я пытаюсь создать кубический патч Безье, и у меня возникли небольшие проблемы с выяснением, где я путаю вычисления. У меня есть 16 контрольных точек в 2-мерном массиве, и я хочу, чтобы сетка имела 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;
}
}
}
Я не совсем уверен, где я иду не так. Я пытаюсь пройтись по сетке по столбцам и вычислить каждую точку Безье.
Я также пытаюсь нарисовать полученную сетку в виде треугольной сетки:
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;
Других решений пока нет …