В качестве задания я должен реализовать алгоритм де Кастельжау, чтобы нарисовать кривую Безье. Я полностью понимаю, как работает этот алгоритм и как он генерирует кривую, но я не понимаю кодовую реализацию алгоритма, с которым мне поручено работать.
Задание состоит из 3 частей:
Рисование некоторого количества контрольных точек, а также ребер, соединяющих их.
Реализация алгоритма де Кастельжау для заданного параметра t
в диапазоне [0, 1], который будет рисовать все линии Де Кастельжау и точку Безье в соответствии с этим параметром. Это делается в функции под названием drawDeCasteljau
Нарисуйте кривую, повторяя от 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
,
Контрольные точки должны быть в самой дальней диагонали матрицы 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
представляет параметр кривой.
Других решений пока нет …