Как контрольные точки упоминаются в этой реализации для рисования кривой?

В качестве задания я должен реализовать алгоритм де Кастельжау, чтобы нарисовать кривую Безье. Я полностью понимаю, как работает этот алгоритм и как он генерирует кривую, но я не понимаю кодовую реализацию алгоритма, с которым мне поручено работать.

Задание состоит из 3 частей:

  1. Рисование некоторого количества контрольных точек, а также ребер, соединяющих их.

  2. Реализация алгоритма де Кастельжау для заданного параметра t в диапазоне [0, 1], который будет рисовать все линии Де Кастельжау и точку Безье в соответствии с этим параметром. Это делается в функции под названием drawDeCasteljau

  3. Нарисуйте кривую, повторяя от 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]);
}
}

Я полностью потерян с bezPoints матрица и отсутствие ссылки на какие-либо контрольные точки / линии в алгоритме.

Должен bezPoints уже заполняться с точками до DrawBezier() выполняется?

Если у меня есть 3 контрольные точки, почему bezPoints матрица 3х3? Что именно эти 9 баллов он хранит?

Как работает алгоритм, даже не ссылаясь на контрольные точки / линии?

РЕДАКТИРОВАТЬ

Благодаря помощи Нико, приведенной ниже, мне удалось нарисовать кривую Безье:

введите описание изображения здесь

Тем не менее, я все еще пытаюсь понять, как выполнить шаг 2 выше, чтобы нарисовать каждую из линий Де Кастельжау, использованных для нахождения точки Безье для текущего значения t,

0

Решение

Контрольные точки должны быть в самой дальней диагонали матрицы 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

И затем, последний пункт в bezPoints[0][0],

Переменная u представляет параметр кривой.

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector