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

Я знаю, что использование алгоритма де Кастельжау — не лучший способ нарисовать кривую Безье, но мне нужно реализовать его для задания. Я определяю свой алгоритм на основе следующих уравнений (из Drexel).

Куда:

определяет контрольные точки.

Я пытаюсь определить функцию для выполнения алгоритма, но я борюсь с тем, где / как включить контрольные точки. Контрольные точки определяются пользователем; когда они взаимодействуют с программой, щелчок левой кнопкой мыши добавляет новую контрольную точку. Моя функция в настоящее время выглядит следующим образом:

2Dpoint deCast(float t)
{
2Dpoint tempDC   // Temporary value of point passed back to OpenGL draw function
tempDC.x = 0; tempDC.y = 0    // Initialize temporary value

int r,i;
int n = C->B.size();   // C is pointer to B vector, which is where the control points are stored in a 2D vector

for (r = 1; r<n, r++)
{
for (i = 0; i<n-r; i++)
{
// Calculation of deCast points goes here
}
}
}

куда 2Dpoint это просто структура, определенная заголовочным файлом, C указатель на местоположение контрольных точек, которые хранятся в 2Dpoint структура называется B (т.е. i Доступ к значению вектора контрольной точки C -> B[i].x а также C -> B[i].y). t предоставляется функции, когда она реализована в моем draw функция, как показано ниже.

void draw()
{
glColor3f(0.0f, 1.0f, 0.0f);
glLineWidth(2.0f);
glBegin(GL_LINE_STRIP);
float DCiter = 0;
while (DCiter <= 1.0)
{
2Dpoint DC = decast(DCiter);
glVertex2f(DC.x, DC.y);
DCiter = DCiter + 0.01;
}
}

0

Решение

Вам также нужно будет передать функции де Кастелляу свои баллы, потому что это и есть единственная причина, по которой алгоритм де Кастеляу работает (что вы даже показываете в своей математической формуле: он читает «следующая точка = взвешенная сумма двух предыдущих точек») ). Так как вам нужно делать линейную интерполяцию между точками, вам нужно работать с точками =)

В псевдокоде:

deCastestljau (t, points):
// the following code is destructive, so remember to be sensible
points = shallowCopy(points);
// de Casteljau's algorithm in four lines:
while points.length > 1:
for i=0 to points.length-2:
points[i] = (1-t) * points[i] + (t) * points[i+1]
points.pop()
// and we're done.
return points[0]

Конец: вы начинаете с контрольных точек, затем выполняете проход линейной интерполяции, чтобы получить все точки «между последовательными координатами» на расстоянии t (например, если t равно 0,25, то вы находите каждую линейную интерполяцию на 1/4 расстояния от некоторой точки до следующей).

Эта операция дает новый набор точек на 1 меньше, чем раньше. Затем вы делаете это снова, и снова, и снова, пока не останетесь с одной точкой. Это ваша точка кривой. Это работает для любого порядка кривой Безье.

Он также не имеет ничего общего с «рисованием» кривой, хотя алгоритм де Кастельжау является способом эффективного вычисления отдельных точек на кривой, он не претендует и не имеет никакого отношения к рисованию целых кривых. Это совершенно другая задача, для которой алгоритм де Кастельжау является лишь одним из многих вариантов, чтобы найти любые точки на кривой, которые вам нужны для работы алгоритма рисования.

0

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

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

По вопросам рекламы [email protected]