Я пытаюсь нарисовать B-сплайн с учетом 11 контрольных точек. Я использую freeglut и C ++.
Я был в состоянии отобразить свои контрольные точки легко. Затем я написал основные функции следующим образом:
float B0(float u){
return float(pow(u - 1, 3) / 6.0);
}
float B1(float u){
return float((3 * pow(u, 3) - 6 * pow(u, 2) + 4) / 6.0);
}
float B2(float u){
return float((-3 * pow(u, 3) + 3 * pow(u, 2) + 3 * u + 1) / 6.0);
}
float B3(float u){
return float(pow(u, 3) / 6.0);
}
Вот мой алгоритм, который вычисляет 100 точек на сегмент и сохраняет вычисленные точки в массиве для отображения. Обратите внимание, что MAX_POINTS является глобальным, а точки — массивом структур с поплавками x, y и z для каждого:
void computeBSpline(){
int MAX_STEPS = 100;
int count = 0;
for (int i = 0; i < NUM_OF_POINTS - 3; i++)
{
cout << "Computing for P" << i << " P " << i + 1 << " P " << i + 2 << " P " << i + 3 << endl;
for (int j = 0; j <= MAX_STEPS; j++)
{
float u = float(j) / float(MAX_STEPS);
float Qx = B0(u) * points[i].x + B1(u) * points[i + 1].x + B2(u) * points[i + 2].x + B3(u) * points[i + 3].x;
float Qy = B0(u) * points[i].y + B1(u) * points[i + 1].y + B2(u) * points[i + 2].y + B3(u) * points[i + 3].y;
pointsBSpline[count].x = Qx;
pointsBSpline[count].y = Qy;
//cout << count << '(' << Qx << ", " << Qy << ")\n";
count++;
}
}
cout << "Computed " << count << " points!\n";
}
Позже я вызову этот DrawBSpline (), который будет проходить по массиву и отображать все точки:
void DrawBSpline(){
glPointSize(1.5);
glColor3d(0.0, 0.0, 0.0);
int i = 0;
glBegin(GL_POINTS);
for (; i < NUM_OF_BSPLINE_POINTS; i++){
glVertex2d(pointsBSpline[i].x, pointsBSpline[i].y);
}
glEnd();
}
Это вывод моей программы:
B-сплайн выход
Я просто не уверен, как соединить сегменты и получить одну плавную кривую. Любая помощь будет оценена.
Оказывается, я написал
float(pow(u-1, 3) / 6.0);
вместо
float(pow(1-u, 3) / 6.0);
Я смущен, проблема исправлена.
Других решений пока нет …