Кубическая кривая Безье

Так что в настоящее время у меня есть кубический патч Безье на плоскости XZ (у = 0, так что это плоский патч). Патч состоит из 16 контрольных точек и 400 точек сетки. То, что я сейчас пытаюсь реализовать, — это выбрать 1 из 4-х средних контрольных точек (любую из них) и увеличивать их в любом направлении координат.

Я думаю, что часть, с которой у меня возникают проблемы, — это отображение изменений с помощью функций рисования OpenGL. Ниже приведен код для создания патча и моя текущая функция рисования, а также пример функции приращения, которую я сейчас использую.

Сетка — это двумерный массив всех точек сетки.
Контроль — это 2-й массив из 16 контрольных точек.
control_point изменяется функцией меню, которую выбирает пользователь (опции 1-4), и устанавливается в 1.

Редактировать: Исправлены последние 2 контрольные точки в инструкции 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);
}

Моя функция onDraw просто вызывает bezier_plane (). Прямо сейчас, с приведенным выше кодом, когда я пытаюсь увеличить с точки зрения у. Треугольники в сетке просто становятся больше, но, похоже, они не рисуют это правильно. Это немного сложно описать.

Результат выглядит так. Первый скриншот до того, как я нажал на приращение. Второй снимок экрана и третий снимок экрана — это то, на что это похоже после 1 щелчка и затем после 10 щелчков. Я также не совсем уверен, почему диапазон патча действительно изменяется, когда я увеличиваю в направлении y (кажется, что он увеличивается, когда я продолжаю увеличивать y).

до приращения

после 1 клика

после 10 кликов

0

Решение

радикал7 решил это за вас. Поскольку вы не устанавливаете сетку в ноль перед вызовом CalcBezier, каждый раз, когда вызывается CalcBezier, все значения сетки увеличиваются. Изменено OnYInc, чтобы оставить контрольные точки в покое и просто InvalidateRect, и вы увидите то же поведение

2

Другие решения

Других решений пока нет …